广州网站建设知名 乐云践新,泰安网站制作推广,wordpress.html,全民代理平台前言#xff1a;
C语言的标准库中有许多字符函数与字符串函数#xff0c;其存在能够大大减轻许多编程压力#xff0c;因此#xff0c;充分了解并能够熟练运用字符函数与字符串函数是很有必要的#xff0c;在本文中#xff0c;我们将对于其进行深入了解
正文开始#xff…前言C语言的标准库中有许多字符函数与字符串函数其存在能够大大减轻许多编程压力因此充分了解并能够熟练运用字符函数与字符串函数是很有必要的在本文中我们将对于其进行深入了解正文开始一.字符分类函数C语言中有一类函数专门用于字符分类使用时需要包含一个头文件ctype.h函数参数符合条件就返回真非0具体函数如下1.iscntrl—任何控制字符2.isspace—空白字符3.isdigit—十进制数字4.isxdigit—十六进制数字5.islower—小写字母a-z6.isupper—大写字母A-Z7.isalpha—字母a-z或者A-Z8.isalnum—字母或者数字9.ispunct—标点符号非任意字母图形或者数字10.isgraph—任何图形字符11.isprint—任何可打印字符包括图形与空白字符示例1.#includectype.hintmain(){intrisdigit(a);//r0;printf(%d\n,r);if(r){printf(是十进制字符\n);}else{printf(不是十进制字符\n);}return0;}输出结果为不是十进制字符intmain(){intrislower(a);//r2;printf(%d\n,r);if(r){printf(是小写字符\n);}else{printf(不是小写字符\n);}return0;}输出结果为是小写字符intmain(){//小写字符转大写chararr[]I am a Chinese;inti0;for(i0;arr[i]!\0;i){intrislower(arr[i]);if(r){arr[i]-32;//a-A32}printf(%c,arr[i]);}return0;}输出结果为I AM A CHINESE二.字符转化函数注仅适用于字母大写转小写tolower小写转大写toupper1次只能够转1个示例intmain(){//小写字符转大写chararr[]I am a Chinese;inti0;for(i0;arr[i]!\0;i){intrislower(arr[i]);if(r){arr[i]toupper(arr[i]);}printf(%c,arr[i]);}return0;}输出结果为I AM A CHINESE字符转换函数的模拟实现:以toupper函数为例charmy_toupper(charx){if(xaxz){x-32;}returnx;}intmain(){//小写字符转大写chararr[]i am a chinese;inti0;for(i0;arr[i]!\0;i){intrislower(arr[i]);if(r){arr[i]my_toupper(arr[i]);}printf(%c,arr[i]);}return0;}该函数也能够行使字符转换功能三.strlen函数前面已讲详情请看指针–习题练习注返回类型size_t–无符号整型–必定大于等于0示例intmain(){if((strlen(abc)-strlen(abcdef))0){printf(\n);}else{printf(\n);}return0;}输出结果为证明返回数字大于0即为无符号整型strlen函数的另一种模拟实现(第一种在指针–习题练习)size_tmy_strlen(constchar*str){if(*str!\0){return1my_strlen(str1);}else{return0;}}四字符串函数1.strcpy功能字符串拷贝拷贝到字符串中的\0为止参数两字符串的首元素地址注1.以\0结束2.\0也会被拷贝3.目标空间必须足够大4.目标空间必须可被修改即arr2初始化时不能是常量字符串示例intmain(){chararr1[]Hello world!;chararr2[]{0};//arr2 arr1;//错误arr2代表地址不可修改//数组名为地址地址是一个编号但地址是常量无法修改char*retstrcpy(arr2,arr1);printf(%s\n,arr2);printf(%s\n,ret);return0;}输出结果为Hello world!Hello world!strcpy函数的模拟实现两个条件1.能够将y代表数组的内容拷贝到x中2.能够返回y数组的首元素地址#includeassert.hchar*my_strcpy(char*x,constchar*y){//x---指针指向目的空间 //y--指针指向源头数据char*retx;assert(yx);//两者均不能为空指针while(*x*y){;}returnret;}intmain(){chararr1[]Hello world!;chararr2[20]xxxxxxxxx;my_strcpy(arr2,arr1);printf(%s\n,arr2);return0;}2.strcat–字符串追加char* strcat(charx,const chary)x----指针指向目的空间y–指针指向源头数据返回目标空间起始地址注1.源字符串x必须以\0结束2.目标字符串中也应有\0(从\0开始追加)3.目标字符串应足够大能够容纳源字符串内容4.目标字符串可修改示例intmain(){chararr1[20]hello \0xxxxxxxx;chararr2[]world!;char*rstrcat(arr1,arr2);printf(%s\n,arr1);printf(%s\n,r);return0;}输出结果为hello world!strcat函数的模拟实现两个条件1.能够将y代表数组的内容追加到x中2.能够返回x数组的首元素地址#includeassert.hchar*my_strcat(char*x,char*y){assert(yx);//1.寻找\0char*rx;while(*x!\0){x;}while(*x*y){;}returnr;}intmain(){chararr1[20]hello \0xxxxxxxx;chararr2[]world!;char*rmy_strcat(arr1,arr2);printf(%s\n,arr1);printf(%s\n,r);return0;}3.strcmp—字符串比较主要内容前面已讲功能从两个字符串首字母开始比较ASCII码值若相同则比较下一字母参数char* a,char* b返回值ab 返回t0 ab 返回t0示例intmain(){chararr1[]abcdef;chararr2[]abq;intrstrcmp(arr1,arr2);printf(%d\n,r);if(r0){printf(arr1arr2\n);}return0;}输出结果为arr1arr2strcmp函数的模拟实现intmy_strcmp(constchar*a,constchar*b){assert(ab);while(*a*b){if(*a\0){return0;//相等}a;b;}if(*a*b){return1;}else{return-1;}}intmain(){chararr1[]abcdef;chararr2[]abq;intrmy_strcmp(arr1,arr2);printf(%d\n,r);if(r0){printf(arr1arr2\n);}return0;}输出结果一致另外:介绍三个类似函数strncpy—strcpystrncat—strcatstrncmp—strcmp长度受限—长度不受限前者相较于后者多出一个参数size_t num,意义为限制拷贝的字符个数主要优点后者相较于前者更加灵活安全示例intmain(){chararr1[]abcdefg;//遇到\0提前结束chararr2[]xxxxxxxxxxxx;//strncpy(arr2, arr1, 5);//最多拷贝5个字符//printf(%s, arr2);//strncat(arr2, arr1, 5);//最多追加5个字符//printf(%s, arr2);intrstrncmp(arr2,arr1,5);//最多比较5个字符printf(%s\n,arr2);printf(%d,r);//1---abreturn0;}其余内容重复不再讲解4.strstr函数功能在一个字符串中寻找另一个字符串第一次出现位置结果找到返回出现位置指针找不到返回NULL示例intmain(){chararr1[]heheabcdefgh;chararr2[]def;char*pstrstr(arr1,arr2);if(p!NULL){printf(找到了%s\n,p);//打印找到位置后的字符串}else{printf(未找到\n);}return0;}strstr函数的模拟实现两种1.char*my_strstr(constchar*a,constchar*b){char*p1a;while(*p1!*b){p1;}size_tlen0;char*p2b;while(*b!\0){b;len;}if(strncmp(p1,p2,len)0){if(*p1!\0){returnp1;}else{returnNULL;}}else{returnmy_strstr(p11,b);}}自己写的char*my_strstr(constchar*a,constchar*b){char*pa;char*s1NULL;char*s2NULL;//特殊场景if(*p\0){returna;}while(*p){s1p;s2b;while(*s1*s2*s1*s2){s1;s2;}if(*s2\0){returnp;}p;}returnNULL;}老师教的:暴力查找其他方式KMP5.strtok函数char * strtok(char * x,char * y)功能1.分割字符串//根据y中的符号//调用一次分割一次2.修改原始字符串分割符号被修改为\03.返回首元素地址示例intmain(){chararr[]zpwyeah.net;charsep[].;charbuf[20]{0};strcpy(buf,arr);char*pNULL;//1.for(pstrtok(buf,sep);p!NULL;pstrtok(NULL,sep)){printf(%s\n,p);}//2.//char* p strtok(buf, sep);//printf(%s\n, p);//zpw//p strtok(NULL, sep);//yeah//printf(%s\n, p);//p strtok(NULL, sep);//net//printf(%s\n, p);//p strtok(NULL, sep);//NULL//printf(%s\n, p);return0;}6.strerror函数char*strerror(int errnum);需要包含头文件string.hC语言库函数在使用发生错误时会将一个错误码记录到errno的变量中功能1.可以通过参数部分的errnum表示错误码得到对应的错误信息并返回错误信息字符串首字符地址2.strerror函数只针对标准库中函数方式错误后设置错误码的转换参数errnum示例intmain(){inti0;for(i0;i10;i){printf(%d:%s\n,i,strerror(i));}//strerror函数将错误码转化为错误信息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 error9 : Bad file descriptor后面不再赘述我们来看一个例子C语言可打开文件该过程称为fopen若以读的方式打开则文件必须存在若不存在打开失败open函数会将错误码放在errno中同时函数返回NULL如下intmain(){FILE*pffopen(data.txt,r);if(pfNULL){printf(错误码为:\n%s\n,strerror(errno));printf(该文件不存在打开失败\n);return1;}//读文件//………………//关闭文件fclose(pf);pfNULL;return0;}7.perror函数:void perror(char*str);功能记录错误码打印错误信息 一体化perror(xxx) --xxx:错误信息缺点不够灵活优点足够方便具体功能前面已经分开介绍故不再赘述后记通过以上示例我们对于字符与字符串函数有了一个较为系统的认识通过不断进行练习熟悉度也会提高下一节我们将认识另一种新的C语言函数内存函数。那么本节内容到此结束我们下节再见