文章目录一、字符分类函数二、字符转换函数三、strlen函数计算字符串长度功能说明使用示例模拟实现四、strcpy函数字符串拷贝功能说明模拟实现五、strcat函数字符串追加功能说明模拟实现六、strcmp函数字符串比较比较规则模拟实现七、strncpy函数指定长度的字符串拷贝功能说明八、strncat函数指定长度的字符串追加功能说明九、strncmp函数指定长度的字符串比较功能说明十、strstr函数查找子字符串功能说明模拟实现十一、strtok函数字符串分割功能说明十二、strerror函数获取错误信息功能说明相关函数perror一、字符分类函数字符分类函数用于判断一个字符属于哪种类型它们都包含在ctype.h头文件中。这些函数的参数为int类型 返回值为非0真或0假。以下是常用的字符分类函数及其功能iscntrl判断是否为控制字符isspace判断是否为空白字符空格 、换页\f、换行\n、回车\r、制表符\t、垂直制表符\visdigit判断是否为十进制数字0~9isxdigit判断是否为十六进制数字0~9、a~f、A~Fislower判断是否为小写字母a~zisupper判断是否为大写字母A~Zisalpha判断是否为字母a~z或A~Zisalnum判断是否为字母或数字a~z、A~Z、0~9ispunct判断是否为标点符号不属于数字或字母的可打印图形字符isgraph判断是否为任何图形字符isprint判断是否为任何可打印字符包括图形字符和空白字符示例使用islower函数islower函数用于判断参数是否为小写字母是则返回非0整数否则返回0。下面的代码将字符串中的小写字母转换为大写其他字符不变#includestdio.h#includectype.hintmain(){inti0;charstr[]Test String.\n;charc;while(str[i]){cstr[i];if(islower(c))c-32;putchar(c);i;}return0;}二、字符转换函数C语言提供了两个常用的字符转换函数同样包含在ctype.h头文件中int tolower(int c)将大写字母转换为小写int toupper(int c)将小写字母转换为大写注意函数的返回类型和字符c都是整型对应字符的ASCII码以%c打印就是字符形式。示例使用toupper函数将上面的小写转大写代码用toupper函数改写#includestdio.h#includectype.hintmain(){inti0;charstr[]Test String.\n;charc;while(str[i]){cstr[i];if(islower(c))ctoupper(c);putchar(c);i;}return0;}三、strlen函数计算字符串长度strlen函数用于计算字符串的长度其原型为size_t strlen(const char *str);功能说明字符串以’\0’作为结束标志strlen返回的是’\0’前面的字符个数不包含’\0’参数指向的字符串必须以’\0’结束返回值为size_t无符号整数这一点在使用时容易出错使用示例#includestdio.h#includestring.hintmain(){constchar*str1abcdef;constchar*str2bbb;if(strlen(str2)-strlen(str1)0)printf(str2str1\n);elseprintf(str1str2\n);return0;}注意由于strlen返回值是无符号数上面代码中strlen(str2)-strlen(str1)的结果是无符号数反码第一位1不是符号位而是有效的数字位会返回一个很大的正数模拟实现strlen有多种模拟实现方式计数器方式intmy_strlen(constchar*str){intcount0;assert(str);// 确保指针非空while(*str){count;str;}returncount;}递归方式不创建临时变量intmy_strlen(constchar*str){assert(str);if(*str\0)return0;elsereturn1my_strlen(str1);}指针-指针方式intmy_strlen(char*s){assert(s);char*ps;while(*p!\0)p;returnp-s;}四、strcpy函数字符串拷贝strcpy函数用于将源字符串拷贝到目标空间原型为char* strcpy(char *destination, const char *source);功能说明源字符串必须以’\0’结束会将源字符串中的’\0’拷贝到目标空间目标空间必须足够大以容纳源字符串目标空间必须可修改模拟实现低配版voidmy_strcpy(char*dest,char*src){while(src!\0){*dest*src;src;dest;}*dest*src;}进阶版assert断言确保destsrc为有效指针const修饰src确保不被修改返回值为原字符串起始地址char*my_strcpy(char*dest,constchar*src){assert(dest!NULL);assert(src!NULL);char*retdest;while(src!\0){*dest*src;src;dest;}*dest*src;returnret;}顶配版合并循环体后置自增先执行src解引用赋值给dest解引用再分别自增直到\0循环语句先执行它的值就是dest解引用的值再判断是否为0\0的ASCII码值是0char*my_strcpy(char*dest,constchar*src){assert(dest!NULL);assert(src!NULL);char*retdest;while(*dest*src};returnret;}intmain(){chararr1[]hello world;chararr2[20]{xxx};my_strcpy(arr2,arr1);printf(%s,arr2);return0;}五、strcat函数字符串追加strcat函数用于将源字符串追加到目标字符串末尾原型为char *strcat(char *destination, const char *source);功能说明源字符串必须以’\0’结束目标字符串也必须以’\0’结束否则无法确定追加的起始位置目标空间必须足够大能容纳源字符串的内容目标空间必须可修改字符串不能自己给自己追加会导致错误模拟实现char*my_strcat(char*dest,constchar*src){char*retdest;assert(dest!NULL);assert(src!NULL);// 找到目标字符串的结束标志\0while(*dest){dest;}// 追加源字符串while((*dest*src)){;}returnret;}六、strcmp函数字符串比较strcmp函数用于比较两个字符串的大小原型为int strcmp(const char *str1, const char *str2);比较规则从第一个字符开始比较若相等则继续比较下一对字符直到字符不同或遇到’\0’标准规定第一个字符串大于第二个字符串返回大于0的数字两个字符串相等返回0第一个字符串小于第二个字符串返回小于0的数字比较的是对应位置字符的ASCII码值模拟实现intmy_strcmp(constchar*str1,constchar*str2){assert(str1!NULL);assert(str2!NULL);while(*str1*str2){if(*str1\0)return0;str1;str2;}return*str1-*str2;}七、strncpy函数指定长度的字符串拷贝strncpy函数可以指定拷贝的字符个数原型为char *strncpy(char *destination, const char *source, size_t num);功能说明拷贝num个字符从源字符串到目标空间不会自动追加\0如果源字符串的长度小于num则拷贝完源字符串后在目标空间后追加\0直到达到num个字符八、strncat函数指定长度的字符串追加strncat函数用于将源字符串的前num个字符追加到目标字符串原型为char *strncat(char *destination, const char *source, size_t num);功能说明将源字符串的前num个字符追加到目标字符串末尾并追加一个’\0’如果源字符串的长度小于num则只追加到源字符串的’\0’为止使用示例#includestdio.h#includestring.hintmain(){charstr1[20];charstr2[20];strcpy(str1,To be );strcpy(str2,or not to be);strncat(str1,str2,6);printf(%s\n,str1);// 输出 To be or notreturn0;}九、strncmp函数指定长度的字符串比较strncmp函数用于比较两个字符串的前num个字符原型为int strncmp(const char *str1, const char *str2, size_t num);功能说明比较两个字符串的前num个字符如果相等则继续比较最多比较num个字符如果提前发现不同则提前结束比较返回值规则与strcmp相同返回值说明0第一个不匹配的字符在str1中的值小于在str2中的值0两个字符串的前num个字符相等0第一个不匹配的字符在str1中的值大于在str2中的值十、strstr函数查找子字符串strstr函数用于查找一个字符串在另一个字符串中第一次出现的位置原型为char *strstr(const char *str1, const char *str2);功能说明返回字符串str2在字符串str1中第一次出现的位置的指针如果str2不是str1的一部分则返回空指针匹配过程不包含’\0’以’\0’作为结束标志使用示例#includestdio.h#includestring.hintmain(){charstr[]This is a simple string;char*pch;pchstrstr(str,simple);strncpy(pch,sample,6);printf(%s\n,str);// 输出 This is a sample stringreturn0;}模拟实现char*my_strstr(constchar*str1,constchar*str2){assert(str1str2);constchar*curstr1;if(*str2\0)return(char*)str1;while(*cur){constchar*s1cur;constchar*s2str2;while(*s1*s2*s1!\0*s2!\0){s1;s2;}if(*s2\0)return(char*)cur;cur;}returnNULL;}十一、strtok函数字符串分割strtok函数用于分割字符串原型为char *strtok(char *str, const char *sep);功能说明sep参数是一个字符串定义了用作分隔符的字符集合第一个参数为str时函数找到str中的第一个标记并用’\0’结尾返回指向该标记的指针同时保存该位置第一个参数为NULL时函数从上次保存的位置继续查找下一个标记如果没有更多标记返回NULLstrtok会修改被操作的字符串所以通常对字符串的临时拷贝进行操作使用示例#includestdio.h#includestring.hintmain(){chararr[]192.168.6.111;char*sep.;char*strNULL;for(strstrtok(arr,sep);str!NULL;strstrtok(NULL,sep))// str不是空指针进入循环{printf(%s\n,str);}return0;}// 输出// 192// 168// 6// 111十二、strerror函数获取错误信息strerror函数用于获取错误码对应的错误信息原型为char *strerror(int errnum);功能说明参数errnum为错误码函数返回该错误码对应的错误信息字符串的地址错误码通常定义在errno.h头文件中程序启动时errno记录当前错误码的变量为0表示没有错误当标准库函数发生错误时会将对应的错误码存入errno使用示例打印0~10的错误码对应的信息#includeerrno.h#includestring.h#includestdio.hintmain(){inti0;for(i0;i10;i){printf(%s\n,strerror(i));}return0;}在Windows11VS2022环境下的输出如下在文件操作中使用#includestdio.h#includestring.h#includeerrno.hintmain(){FILE*pFile;pFilefopen(unexist.ent,r);//以读的形式打开文件如果没有则打开失败if(pFileNULL)printf(Error opening file unexist.ent: %s\n,strerror(errno));return0;}相关函数perrorperror函数可以直接打印错误信息它会先打印参数中的字符串再打印一个冒号和空格最后打印错误信息。头文件stdio.h#includestdio.h#includeerrno.hintmain(){FILE*pFile;pFilefopen(unexist.ent,r);if(pFileNULL)perror(Error opening file unexist.ent);return0;}// 输出Error opening file unexist.ent: No such file or directory