当前位置: 首页 > news >正文

C语言-字符串(定义)、字符串函数(strlen、strcat、strcpy、strcmp、strlwr、strupr)

本章概述思维导图:

字符串

字符串(String) 是计算机科学和编程中的基本数据类型,用于表示由字符组成的序列,通常用来存储和处理文本信息。

字符串的定义:

字符串细节:

1.在底层,实际存储的时候,C语言还是会把字符串“abc”转换成字符数组进行保存,并 且在末尾还要在加上‘\ 0’;

2.用数组定义时,数组的长度要么不写,如果要写的化,记得要把结束标记的空间给预留出来;

3. 字符数组 + 双引号的方式定义字符串,内容是可以发生改变的;

4. 利用指针 + 双引号的方式定义字符串,会把底层的字符数组放在只读常量区,内容不可以修改;

只读常量区特点:内容不可以修改,里面定义的字符串是可以复用的;


代码示例第一种定义格式:

#include <stdio.h>
int main()
{char arr1[4]="abc";printf("arr1=%s\n",arr1);return 0;
}//代码运行结果:
arr1=abc

代码讲解:定义了一个长度为4的字符数组 arr1,并用字符串 "abc" 初始化它(编译器会自动在末尾添加一个隐藏的空字符 '\0',使数组实际存储为 {'a','b','c','\0'}),通过 printf 的 %s 格式符输出该字符串。由于数组长度足够容纳3个可见字符和1个结束符,程序能正确打印 ;若数组长度不足(如设为3),则会导致 '\0' 缺失,引发未定义行为(可能打印乱码或崩溃)。

关键点在于:C语言中字符串必须以 '\0' 结尾,且字符数组需预留足够空间。


代码示例第二种定义格式:

#include <stdio.h>
int main()
{char *arr2="abc";printf("arr2=%s\n",arr2);return 0;
}//代码运行结果:
arr2=abc

代码讲解:定义了一个字符指针 arr2 并指向字符串字面量 "abc"(存储在只读内存),通过 printf 的 %s 格式符输出指针指向的字符串内容 abc

关键点:在于 arr2 是只读指针(不可修改其指向的字符,否则会引发未定义行为),而字符数组(如 char arr[] = "abc")会将字符串拷贝到可修改的栈内存中,因此需根据是否需要修改字符串来选择合适的方式。


代码示例第三种定义格式:

#include <stdio.h>
int main()
{char arr3[]={'a','b','c'};for(int i=0;i<3;i++){printf("%c",arr3[i]);}putchar('\n');return 0;
}//代码运行结果
abc

代码讲解:这段C代码定义了一个字符数组 arr3,通过显式初始化 {'a','b','c'} 填充3个字符(无 '\0' 结尾),随后用 for 循环和 printf("%c") 逐个打印字符,最终输出 abc 并换行;

关键点:由于数组未以空字符结尾,它不是合法的C字符串,若误用 %s 格式符会导致未定义行为(如内存越界访问),而当前代码通过 %c 逐字符打印是安全的;若需字符串操作,应改用 char arr[] = "abc" 初始化(自动添加 '\0')。


字符串函数

在C语言中,字符串函数是标准库(<string.h>)提供的用于操作字符串的工具;

字符串函数:strlen( )函数获取字符串的长度

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[]="abc";int len1=strlen(arr1);printf("arr1=%s,长度为:%d",arr1,len1);return 0;
}//代码运行结果:
arr1=abc,长度为:3

代码讲解:通过 strlen() 函数计算字符串长度并输出结果:char arr1[] = "abc" 初始化一个以 '\0' 结尾的字符数组,strlen(arr1) 从首地址开始遍历字符直到遇到 '\0',返回有效长度3(不包含 '\0'),最终通过 printf 输出字符串内容 "abc" 和长度 3

底层实现strlen函数代码示例:

int str_len(char arr[])//计算字符串长度函数
{int i=0;while(arr[i]!='\0'){i++;}return i;
}

字符串函数:strcar( )函数拼接两个字符串

在数组1后面接入数组2;

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[]="abc";char arr2[]="def";strcat(arr1,arr2);printf("arr1=%s\n",arr1,);return 0;
}//代码运行结果:
arr1=abcdef

代码讲解:首先定义两个字符数组 arr1 和 arr2,分别初始化为 "abc" 和 "def";随后调用 strcat()函数,该函数会从 arr1 的 '\0' 位置开始,将 arr2 的内容(包括 '\0')追加到 arr1 中,使 arr1 最终变为 "abcdef";最后通过 printf 输出 arr1 的内容,结果输出为 :arr1=abcdef

底层实现strlen函数代码示例:

void str_cat(char* arr1,char *arr2)//字符串拼接函数
{int i=0;while(arr1[i]!='\0'){i++;}int j=0;while(arr2[j]!='\0'){arr1[i]=arr2[j];j++;i++;}arr1[i]='\0';
}

字符串函数:strcpy( )函数复制字符串

把数组2拷贝在数组1中;

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[]="abc";char arr2[]="def";strcpy(arr1,arr2);printf("arr1=%s\n",arr1);return 0;
}//代码运行结果:
arr1=def;

代码讲解:首先定义两个字符数组 arr1 和 arr2,分别初始化为 "abc" 和 "def";随后使用 strcpy 函数将字符串 "def"(包括终止符 '\0')从 arr2 复制到 arr1,覆盖了 arr1 原有的 "abc",最终 arr1 的内容变为 "def" 并正确输出;

底层实现strcpy函数代码示例:

void str_cpy(char* arr1,char *arr2)//字符串复制函数
{int i=0;while(arr2[i]!='\0'){arr1[i]=arr2[i];i++;}arr1[i]='\0';
}

字符串函数:strcmp( )函数比较两个字符串

返回值为:相同放回值为0;不相同返回值非零数;

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[]="abc";char arr2[]="def";int num1=strcmp(arr1,arr2);printf("arr1和arr2是否相同(相同为0不同为非0数):%d\n",num1);return 0;
}//代码运行结果:
arr1和arr2是否相同(相同为0不同为非0数):-3

代码讲解:首先定义两个字符数组 arr1 和 arr2,分别初始化为 "abc" 和 "def";随后使用strcmp 比较了两个字符串 "abc" 和 "def" 的字典序:strcmp 会逐字符对比它们的 ASCII 码值,先比较 'a'(97)和 'd'(100),因 97 < 100 直接返回负数(通常为 -1),最终输出结果为非零值,表明两字符串不同;其核心逻辑是通过遍历字符直到遇到差异或终止符 '\0',返回第一个不同字符的 ASCII 差值,若完全相同则返回 0,需注意返回值仅表示大小关系而非固定为 1 或 -1;

底层实现strcmp函数代码示例:

int str_cmp(char *arr1,char *arr2)//字符串比较函数
{int i=0;while(arr1[i]!='\0' && arr2[i]!='\0'){if(arr1[i] ==arr2[i]){i++;}else {return 1;}}return 0;
}

字符串函数:strlwr( )函数将字符串变成小写

把字符串里的大写字母转换为小写字母

代码示例:

#include <stdio.h>
#include <string.h>
void str_lwr(char arr1[])
{int i=0;while(arr1[i]!='0'){if(arr1[i]>='A' && arr1[i]<='Z'){arr1[i]=arr1[i]+32;}i++;}arr1[i]='\0';
};
int main()
{char arr1[]="ABC";strlwr(arr1);printf("arr1=%s\n",arr1);return 0;
}//代码运行结果:
arr1=abc

代码讲解:首先定义一个字符数组 arr1 ,初始化为 "abc";通过 strlwr 函数将字符串 "ABC" 转换为小写并输出 ;

底层实现strlwr函数代码示例:

void str_lwr(char arr1[])
{int i=0;while(arr1[i]!='0'){if(arr1[i]>='A' && arr1[i]<='Z'){arr1[i]=arr1[i]+32;}i++;}arr1[i]='\0';
}

字符串函数:strupr( )函数将字符串变成大写

把字符串里的小写字母转换为大写字母

代码示例:

#include <stdio.h>
#include <string.h>
void str_upr(char arr1[])
{int i=0;while(arr1[i]!='0'){if(arr1[i]>='a' && arr1[i]<='z'){arr1[i]=arr1[i]-32;}i++;}arr1[i]='\0';
};
int main()
{char arr1[]="abc";str_upr(arr1);printf("arr1=%s\n",arr1);return 0;
}//代码运行结果:
arr1=ABC

代码讲解:首先定义一个字符数组 arr1 ,初始化为 "abc";通过 strlwr 函数将字符串 "abc" 转换为大写并输出 ;

底层实现strlwr函数代码示例:

void str_upr(char arr1[])
{int i=0;while(arr1[i]!='0'){if(arr1[i]>='a' && arr1[i]<='z'){arr1[i]=arr1[i]-32;}i++;}arr1[i]='\0';
}

字符串练习题

通过本章的学习,接下来就是进入实战环节,小伙伴们开始攻略C语言字符串练习题啦!小伙伴们先尝试自己敲代码敲完后在来查看代码示例呦!

字符串(遍历字符串)

题目:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

代码示例:

#include <stdio.h>
#define max 100
void arr_bianli(char *arr);
int main()
{char arr[max];arr_bianli(arr);return 0;
}
void arr_bianli(char *arr)
{printf("输入字符实现遍历\n");scanf("%s",arr);printf("arr=%s\n",arr);
}

字符串(大小写转换)

题目:键盘录入一个字符串数组arr1,实现大小写转换

代码示例:

#include <stdio.h>
#include <string.h>
void str_upr(char arr1[])
{int i=0;while(arr1[i]!='0'){if(arr1[i]>='a' && arr1[i]<='z'){arr1[i]=arr1[i]-32;}i++;}arr1[i]='\0';
};
void str_lwr(char arr1[],int len1)
{for(int i=0;i<len1;i++){if(arr1[i]>='A' && arr1[i]<='Z'){arr1[i]=arr1[i]+32;}}arr1[len1]='\0';
};
int main()
{char arr1[];printf("开始赋值\n");scanf("%s",arr1);str_upr(arr1);str_lwr(arr1);printf("arr1=%s\n",arr1);return 0;
}

字符串(拷贝)

题目:有两个字符串arr1和arr2,分别赋值为myy和lyf,使其arr1赋值arr2的内容;

代码示例:

#include <stdio.h>
#include <string.h>
void str_cpy(char* arr1,char *arr2);//字符串复制函数
int main()
{char arr1[]="myy";char arr2[]="lyf";str_cpy(arr1,arr2);printf("arr1=%s\n",arr1);return 0;
}
void str_cpy(char* arr1,char *arr2)//字符串复制函数
{int i=0;while(arr2[i]!='\0'){arr1[i]=arr2[i];i++;}arr1[i]='\0';
}

字符串(拼接)

题目:有两个字符串arr1和arr2,分别赋值为"我们"和"爱编程",使其arr1拼接arr2的内容;

代码示例:

#include <stdio.h>
#include <string.h>
void str_cat(char* arr1,char *arr2);//字符串拼接函数
int main()
{char arr1[]="我们";char arr2[]="爱编程";str_cat(arr1,arr2);printf("arr1=%s\n",arr1);return 0;
}
void str_cat(char* arr1,char *arr2)//字符串拼接函数
{int i=0;while(arr1[i]!='\0'){i++;}int j=0;while(arr2[j]!='\0'){arr1[i]=arr2[j];j++;i++;}arr1[i]='\0';
}

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

http://www.lryc.cn/news/607495.html

相关文章:

  • 【string类常见接口】
  • Linux系统编程Day3-- Linux常用操作(续)
  • 基于深度学习的医学图像分析:使用Autoencoder实现医学图像去噪
  • Flask 路由系统:URL 到 Python 函数的映射
  • Coze Studio概览(五)--工作流管理
  • 20250801在Ubuntu24.04.2LTS下编译firefly_itx_3588j的Android12时解决boot.img过大的问题
  • 【lucene】FastVectorHighlighter案例
  • 基于线性规划的储能充放电仿真系统
  • Android Frameworks从零开始
  • JSON 对象在浏览器中顺序与后端接口返回不一致的问题
  • 好未来披露2026财年Q1财报:净利润3128万美元,同比大增174%
  • Day 28:类的定义和方法
  • Git 命令使用指南:从入门到进阶
  • MySQL CPU占用过高排查指南
  • 数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南
  • Agents-SDK智能体开发[3]之多Agent执行流程
  • SN74LVC1G08DBVR 德州仪器(TI)逻辑芯片IC 电源芯片 ESD保护
  • 智慧社区构建——2
  • C语言(02)——标准库函数大全(持续更新)
  • AI Agent 视角:可执行程序的二进制格式,是一场「结构化语言」与「智能解析」的双向奔赴
  • 一套视频快速入门并精通PostgreSQL
  • 03 Broker主从架构和集群模式
  • (二)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • Hutool 的完整 JSON 工具类示例
  • 使用社区 EE 镜像运行 Ansible
  • Redis的ZipList、SkipList和ListPack之间的区别
  • 在Alpine Linux上配置Redis使用NFS存储的完整指南
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络
  • 每天一点跑步运动小知识
  • 逻辑回归算法 银行贷款资格判断案例,介绍混淆矩阵与正则化惩罚