ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言——字符函数和字符串函数

C语言——字符函数和字符串函数 耕耘 :C、C、嵌入式技术领域我的个人主页❄️个人专栏《C语言专栏》 《嵌入式专栏》✨**不要等待机会而要创造机会!**✨博主简介:✨✨一位热爱生活的阳光大男孩.✨✨前言本文系统梳理了 C 语言标准库中常用的字符串处理函数涵盖字符分类与转换、字符串长度计算、拷贝、连接、比较、查找、分割及错误处理等核心操作。每个函数均配有清晰的语法说明、功能解析、使用示例和关键注意事项旨在帮助读者快速掌握这些基础但至关重要的工具为编写高效、安全的 C 语言程序打下坚实基础。文章目录前言1. 字符分类函数2. 字符转换函数3. strlen3.1 代码演⽰3.2 strlen返回值3.3 strlen的模拟实现4. strcpy5. strcat6. strcmp7. strncpy比strcpy多了一层保障7.2 ⽐较strcpy和strncpy函数8. strncat8.2 strcat和strncat对⽐9. strncmp9.2 strcmp和strncmp⽐较10. strstr11. strtok 函数的使⽤11.2 注意事项12. strerror 函数的使⽤12.2 perror结语1. 字符分类函数C语⾔中有⼀系列的函数是专⻔做字符分类的也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是ctype.h下面就讲解一个函数其他的用法也类似intislower(intc);islower 是能够判断参数部分的 c 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟如果是⼩写字⺟就返回⾮0的整数如果不是⼩写字⺟则返回0。#includestdio.h#includectype.h//islower的头文件intmain(){inti0;charstr[]Test String.\n;charc;while(str[i]){cstr[i];if(islower(c))//判断是否是小写不是的话就返回1{c-32;//修改成小写修改ASCLL就可以了}putchar(c);//函数作用是打印单字符i;}return0;}介绍putchar是 C 语言标准库中的一个函数用于向标准输出单个字符每次调用仅输出一个字符。其原型定义在头文件 stdio.h2. 字符转换函数C语⾔提供了2个字符转换函数inttolower(intc);//将参数传进去的⼤写字⺟转⼩写inttoupper(intc);//将参数传进去的⼩写字⺟转⼤写上⾯的代码我们将⼩写转⼤写是-32完成的效果有了转换函数就可以直接使⽤tolower函数。#includestdio.h#includectype.hintmain(){inti0;charstr[]Test String.\n;charc;while(str[i]){cstr[i];if(islower(c)){ctoupper(c);//大写改为小写}putchar(c);i;}return0;}3. strlen3.1 代码演⽰size_tstrlen(constchar*str);功能统计参数 str 指向的字符串的⻓度。统计的是字符串中‘\0’ 之前的字符的个数。参数str 指针指向了要统计⻓度的字符串。返回值返回了 str 指向的字符串的⻓度返回的⻓度不会是负数所以返回类型是 size_t#includestdio.h#includestring.hintmain(){constchar*strabcdef;printf(%zd\n,strlen(str));//输出结果是6return0;}使⽤注意事项1、字符串以 ‘\0’ 作为结束标志strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数不包含 ‘\0’ )。2、参数指向的字符串必须要以 ‘\0’ 结束。3、注意函数的返回值为 size_t 是⽆符号的 易错 4、strlen 的使⽤需要包含头⽂件 string.h3.2 strlen返回值#includestdio.h#includestring.hintmain(){constchar*str1abcdef;constchar*str2bbb;if(strlen(str2)-strlen(str1)0){printf(str2 str1\n);}else{printf(srt1 str2\n);}return0;}3.3 strlen的模拟实现方法1//计数器⽅式intmy_strlen(constchar*str){intcount0;assert(str);while(*str){count;str;}returncount;}方法2//不能创建临时变量计数器intmy_strlen(constchar*str){assert(str);if(*str\0)return0;elsereturn1my_strlen(str1);}方法3//指针-指针的⽅式intmy_strlen(char*s){assert(str);char*ps;while(*p!\0)p;returnp-s;}4. strcpychar*strcpy(char*destination,constchar*source);功能字符串拷⻉拷⻉到源头字符串中的 \0 为⽌。参数destination 指针指向⽬的地空间source 指针指向源头数据返回值strcpy 函数返回的⽬标空间的起始地址#includestdio.h#includestring.hintmain(){chararr1[10]{0};//他的空间要有固定值chararr2[]hello;strcpy(arr1,arr2);//把arr2里面的字符拷贝进arr1printf(%s\n,arr1);return0;}使⽤注意事项1、源字符串必须以 ‘\0’ 结束。2、会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。3、⽬标空间必须⾜够⼤以确保能存放源字符串。4、⽬标空间必须可修改。5. strcatchar*strcat(char*destination,constchar*source);功能字符串追加把 source 指向的源字符串中的所有字符都追加到 destination 指向的空间中。参数destination 指针指向⽬的地空间source 指针指向源头数据返回值strcat 函数返回的⽬标空间的起始地址#includestdio.h#includestring.hintmain(){chararr1[20]hello ;chararr2[]world;strcat(arr1,arr2);//把arr2里面的字符加到arr1中printf(%s\n,arr1);return0;}使⽤注意事项1、源字符串必须以 ‘\0’ 结束。2、⽬标字符串中也得有 \0 否则没办法知道追加从哪⾥开始。3、⽬标空间必须有⾜够的⼤能容纳下源字符串的内容。4、⽬标空间必须可修改6. strcmpintstrcmp(constchar*str1,constchar*str2);功能⽤来⽐较 str1 和 str2 指向的字符串从两个字符串的第⼀个字符开始⽐较如果两个字符的ASCII码值相等就⽐较下⼀个字符。直到遇到不相等的两个字符或者字符串结束。参数str1 指针指向要⽐较的第⼀个字符串str2 指针指向要⽐较的第⼆个字符串返回值• 标准规定◦ 第⼀个字符串⼤于第⼆个字符串则返回⼤于0的数字◦ 第⼀个字符串等于第⼆个字符串则返回0◦ 第⼀个字符串⼩于第⼆个字符串则返回⼩于0的数字#includestdio.h#includestring.hintmain(){chararr1[]abcdef;chararr2[]abq;intretstrcmp(arr1,arr2);printf(%d\n,ret);if(ret0)printf(arr1 arr2\n);elseif(ret0)printf(arr1 arr2\n);elseprintf(arr1 arr2\n);return0;}7. strncpy比strcpy多了一层保障char*strncpy(char*destination,constchar*source,size_tnum)功能字符串拷⻉将 source 指向的字符串拷⻉到 destination 指向的空间中最多拷⻉ num个字符。参数destination 指针指向⽬的地空间source 指针指向源头数据num 从source指向的字符串中最多拷⻉的字符个数返回值strncpy 函数返回的⽬标空间的起始地址#includestdio.h#includestring.hintmain(){chararr1[20]{0};chararr2[]abcdefghi;char*strstrncpy(arr1,arr2,5);//只拷贝arr2中的5个字母printf(%s\n,arr1);printf(%s\n,str);return0;}7.2 ⽐较strcpy和strncpy函数1、strcpy 函数拷⻉到 \0 为⽌如果⽬标空间不够的话容易出现越界⾏为。2、strncpy 函数指定了拷⻉的⻓度源字符串不⼀定要有 \0 同时在设计参数的时候就会多⼀层思考⽬标空间的⼤⼩是否够⽤ strncpy 相对 strcpy 函数更加安全8. strncatchar*strncat(char*destination,constchar*source,size_tnum);功能字符串追加将 source 指向的字符串的内容追加到 destination 指向的空间最多追加 num 个字符。参数destination 指针指向了⽬标空间source 指针指向了源头数据num 最多追加的字符的个数返回值返回的是⽬标空间的起始地址#includestdio.h#includestring.hintmain(){chararr1[20]hello ;chararr2[]world;char*strstrncat(arr1,arr2,4);//只追加arr2中的4个字母printf(%s\n,arr1);printf(%s\n,str);return0;}8.2 strcat和strncat对⽐1、参数不同 strncat 多了⼀个参数2、 strcat 函数在追加的时候要将源字符串的所有内容包含 \0 都追加过去但是 strncat 函数指定了追加的⻓度。3、strncat 函数中源字符串中不⼀定要有 \0 了。4、strncat 更加灵活也更加安全。9. strncmpintstrncmp(constchar*str1,constchar*str2,size_tnum);功能字符串⽐较⽐较 str1 和 str2 指向的两个字符串的内容最多⽐较 num 字符。参数str1 指针指向⼀个⽐较的字符串str2 指针指向另外⼀个⽐较的字符串num 最多⽐较的字符个数返回值标准规定1、第⼀个字符串⼤于第⼆个字符串则返回⼤于0的数字2、第⼀个字符串等于第⼆个字符串则返回03、第⼀个字符串⼩于第⼆个字符串则返回⼩于0的数字#includestdio.h#includestring.hintmain(){chararr1[]abcdef;chararr2[]abcqw;intret1strncmp(arr1,arr2,3);//比较前三个字符相等返回0printf(%d\n,ret1);intret2strncmp(arr1,arr2,4);//比较前四个字符小于arr1的前四个则返回一个小于0的数printf(%d\n,ret2);return0;}9.2 strcmp和strncmp⽐较1、参数不同2、strncmp可以⽐较任意⻓度了3、strncmp函数更加灵活更加安全10. strstrchar*strstr(constchar*str1,constchar*str2);功能strstr 函数查找 str2 指向的字符串在 str1 指向的字符串中第⼀次出现的位置。简⽽⾔之在⼀个字符串中查找⼦字符串。strstr 的使⽤得包含string.h参数str1 指针指向了被查找的字符串str2 指针指向了要查找的字符串返回值1、如果str1指向的字符串中存在str2指向的字符串那么返回第⼀次出现位置的指针2、如果str1指向的字符串中不存在str2指向的字符串那么返回NULL#includestdio.h#includestring.hintmain(){charstr[]This is a simple string;char*pch;pchstrstr(str,simple);//在str中找simpleif(pch!NULL)printf(%s\n,pch);elseprintf(查找的字符串不存在\n);return0;11. strtok 函数的使⽤char*strtok(char*str,constchar*delim);功能1、分割字符串根据 delim 参数中指定的分隔符将输⼊字符串 str 拆分成多个⼦字符串。2、修改原始字符串 strtok 会直接在原始字符串中插⼊ ‘\0’ 终⽌符替换分隔符的位置因此原始字符串会被修改。参数1、str ⾸次调⽤时传⼊待分割的字符串后续调⽤传⼊ NULL 表⽰继续分割同⼀个字符串。2、 delim 包含所有可能分隔符的字符串每个字符均视为独⽴的分隔符。返回值1、成功时返回指向当前⼦字符串的指针。2、没有更多⼦字符串时返回 NULL 。使⽤步骤1、⾸次调⽤传⼊待分割字符串和分隔符。2.、后续调⽤传⼊ NULL 和相同的分隔符继续分割。3、 结束条件当返回 NULL 时表⽰分割完成。#includestdio.h#includestring.hintmain(){chararr[]192.168.6.111;//这里的分隔符就是“.”constchar*sep.;//把分隔符放进sep中constchar*strNULL;charbuf[30]{0};strcpy(buf,arr);//将arr中的字符串拷⻉到buf中对buf的内容进⾏切割for(strstrtok(buf,sep);str!NULL;strstrtok(NULL,sep)){printf(%s\n,str);//找到一次打印一次}return0;}11.2 注意事项1、破坏性操作 strtok 会直接修改原始字符串将其中的分隔符替换为 ‘\0’ 。如果需要保留原字符串应先拷⻉⼀份。2、连续分隔符多个连续的分隔符会被视为单个分隔符不会返回空字符串。3、空指针处理如果输⼊的 str 为 NULL 且没有前序调⽤⾏为未定义。12. strerror 函数的使⽤char*strerror(interrnum);功能1、strerror 函数可以通过参数部分的 errnum 表⽰错误码得到对应的错误信息并且返回这个错误信息字符串⾸字符的地址。2、strerror 函数只针对标准库中的函数发⽣错误后设置的错误码的转换。3、strerror 的使⽤需要包含string.h参数errnum 表⽰错误码这个错误码⼀般传递的是 errno 这个变量的值在C语⾔有⼀个全局的变量叫 errno 当库函数的调⽤发⽣错误的时候就会将本次错误的错误码存放在 errno 这个变量中使⽤这个全局变量需要包含⼀个头⽂件 errno.h 。返回值函数返回通过错误码得到的错误信息字符串的⾸字符的地址。#includeerrno.h#includestring.h#includestdio.h//我们打印⼀下0~10这些错误码对应的信息intmain(){inti0;for(i0;i10;i){printf(%d: %s\n,i,strerror(i));}return0;}//结果//0: No error//1 : Operation not permitted//2 : No such file or directory//3 : No such process//4 : Interrupted function call//5 : Input / output error//6 : No such device or address//7 : Arg list too long//8 : Exec format error//9: Bad file descriptor//10: No child processes#includestdio.h#includestring.h#includeerrno.hintmain(){FILE*pFileNULL;//fopen函数以读的形式打开⽂件如果⽂件不存在则打开失败。pFilefopen(unexist.ent,r);if(pFileNULL){printf(错误信息是%s\n,strerror(errno));return1;//错误返回}return0;}//结果//错误信息是No such file or directory12.2 perrorvoidperror(constchar*str);也可以了解⼀下 perror 函数 perror 函数相当于⼀次将上述代码中的第**“ printf(“错误信息是%s\n”, strerror(errno)); ”**⾏完成了直接将错误信息打印出来。 perror 函数打印完参数部分的字符串后再打印⼀个冒号和⼀个空格再打印错误信息。#includestdio.h#includestring.h#includeerrno.hintmain(){FILE*pFileNULL;pFilefopen(unexist.ent,r);if(pFileNULL){perror(错误信息是);//直接打印return1;}return0;}//结果//错误信息是: No such file or directory结语“关注我的都能暴富——别问问就是玄学反正我先信了”完.完.
返回列表