西安域名注册网站建设,win7图标不显示wordpress,关键词优化上海,四川省建设厅职称网站C语言程序设计笔记---018 C语言字符串函数1、字符串函数1.1、strlen函数1.2、strcpy函数1.3、strcat函数1.4、strcmp函数1.5、strncpy函数1.6、strncat函数1.7、strncmp函数1.8、strstr函数1.9、strtok函数1.10、strerror函数 2、字符分类函数2.1、islower函数2.2、isdigit 和 … C语言程序设计笔记---018 C语言字符串函数1、字符串函数1.1、strlen函数1.2、strcpy函数1.3、strcat函数1.4、strcmp函数1.5、strncpy函数1.6、strncat函数1.7、strncmp函数1.8、strstr函数1.9、strtok函数1.10、strerror函数 2、字符分类函数2.1、islower函数2.2、isdigit 和 isxdight函数2.3、islower 和 isupper函数 3、字符转换函数3.1、tolower函数3.2、toupper函数 4、结语 C语言字符串函数
前言 通过C语言指针进阶的知识接下来继续学习关于C语言哪些实用的函数呢
/知识点汇总/ 字符串函数分类 1.求字符串长度strlen 2.长度不受限制的字符串函数strcpy、strcat、strcmp 3.长度受限制的字符串函数strncpy、strncat、strncmp 4.字符串查找函数strstr、strtok 5.错误信息报告函数strerroe、perror 6.字符分类函数 iscntrl – 任何控制字符 isspace – 空白字符‘空格’换页’\f’回车’\n’制表符’\t’. isdigit — 十进制数字0~9 isxdigit – 十六进制数字 包括十进制数字小写字母af,大写字母AF islower — 小写字母a~z isupper — 大写字母A~Z isalpha – 字母az或AZ isalnum – 字母或数字 az,AZ,0~9 ispunct – 标点符号任何不属于数字或者字母的图形字符 isgraph – 任何图形字符 7.字符转换函数 int tolower (int c); — 大写转小写字母 int toupper (int c); — 小写转大写字母 这里把1~6的函数归纳到字符串函数里讲解
1、字符串函数
1.1、strlen函数
库函数用来求字符串长度的库函数本质上统计的是字符串中’\0’之前的字符个数 原型size_t strlen( const char *string ); 头文件#include string.h
#include stdio.h
#include string.h
int main()
{size_t len1 strlen(abcdef);//等价其中传参传递的首元素地址const char* str abcdef;size_t len2 strlen(str);printf(%d\n, len1);//6printf(%d\n, len2);//6//另外得注意,字符串本身就放置了\0的情况size_t len1 strlen(abc\0def);const char* str abc\0def;size_t len2 strlen(str);printf(%d\n, len1);//3printf(%d\n, len2);//3return 0;
}补充size_t 的特点
#include stdio.h
#include string.hint main()
{if (strlen(abc) - strlen(abcdef) 0)//因为strlen的返回值是无符号数//两个无符号数相减得到的依然是无符号数//相等于即使相减为负数但是返回值会约束其符号位无效了从而成为一个很大的数远远大于0printf(0\n);elseprintf(0\n);return 0;
}1.2、strcpy函数
功能完成字符串的拷贝将原目标字符串地址拷贝到目标字符串地址。 原型char *strcpy( char *strDestination, const char *strSource ); 头文件#include string.h
#include stdio.h
#include string.hint main()
{char arr1[20] { 0 };char arr2[] hello;strcpy(arr1, arr2);printf(%s\n, arr1);return 0;
}使用strcpy几个注意事项 1.源字符串必须以’\0’结束因为会包括’\0’一起拷贝过去 2.会将源字符串中的’\0’拷贝到目标空间 3.目标空间必须足够大确保能存放源字符串 4.目标空间必须可变(不能是常量) 5.学会模拟实现才能更好掌握
#include stdio.h
#include string.hint main()
{char arr1[20] xxxxxxxxxxxxxxx;//char arr2[] hello;//char arr2[] {A,B,C};char arr2[] { A,B,C,\0};strcpy(arr1, arr2);printf(%s\n, arr1);return 0;
}小结所以是由程序员决定目标空间必须足够大且目标空间必须权限为可写
1.3、strcat函数
功能将源头的字符串地址追加到目标字符串的地址 原型char *strcat( char *strDestination, const char *strSource ); 头文件string.h 执行步骤 1.找到arr1的末尾’\0’ 2.再把arr1的内容追加到arr1后边arr2的首地址会覆盖arr1的’\0’实现追加
#include stdio.h
#include string.h
int main()
{char arr1[20] abc;char arr2[] def;strcat(arr1, arr2);printf(%s\n, arr1);//abc(追加)defreturn 0;
}注意事项 1.目标空间足够大 2.目标空间必须有’\0’(保证能找到目标空间的末尾) 3.源字符串也得有’\0’,拷贝时会一通拷贝过去从而组成新字符串得结束位标志符 4.自己追加自己时源指针和目标指针都指向首字符然后源字符串的’\0’,会被覆盖掉导致后面追加时找不到’\0’了。尽管库函数能实现但是不建议
1.4、strcmp函数
功能字符串比较大小不是比较长度而是比较对应位置上的字符大小即ASCII码值 原型int strcmp( const char *string1, const char *string2 ); 头文件string.h Return Value Value Relationship of string1 to string2 // 0 string1 less than string2 //0 string1 identical to string2 // 0 string1 greater than string2 标准规定比较ASCLL码值 1.第一个字符串大于第二个字符串则返回大于0的数字 2.第一个字符串等于第二个字符串则返回0 3.第一个字符串小于第二个字符串则返回小于0的数字
#include stdio.h
#include string.h
int main()
{char arr1[] abcdef;char arr2[] abq;int ret strcmp(arr1, arr2);printf(%d\n, ret);//-1第一个字符串比第二个字符串小返回小于零的数值return 0;
}小结 strlen,strcat,strcmp,strcpy属于长度不受限制的字符串函数 接着介绍长度受限制字符串函数strncat,strncmp,strncpy
1.5、strncpy函数
功能字符串拷贝可指定长度 原型char* strncpy(char* strDest, const char* strSource, size_t count); 头文件string.h
#include stdio.h
#include string.h
int main()
{char arr1[20] { 0 };char arr2[] abcdefghi;strncpy(arr1, arr2, 3);printf(%s\n, arr1);//abcchar arr1[20] xxxxxxxxxxxxxxx;char arr2[] abcdefghi;strncpy(arr1, arr2, 3);printf(%s\n, arr1);//abcxxxxxxxxxxreturn 0;
}探讨拷贝长度的影响
#include stdio.h
#include string.hint main()
{char arr1[20] xxxxxxxxxxxx;char arr2[] abc;strncpy(arr1, arr2, 6);//长度比str2长时自动补的\0.printf(%s\n, arr1);//abc\0\0\0return 0;
}1.6、strncat函数
功能字符串追加可指定长度 原型char* strncat(char* strDest, const char* strSource, size_t count); 头文件string.h
#include stdio.h
#include string.hint main()
{char arr1[20] abc;char arr2[] defghi;strncat(arr1, arr2, 3);//长度比str2长时自动补的\0.printf(%s\n, arr1);//abcreturn 0;
}探究’\0’的追加情况1
#include stdio.h
#include string.h
int main()
{char arr1[20] abc\0xxxxxxxxxxx;//字符串中本身具备\0时依然以\0开始覆盖最后补\0结束char arr2[] defghi;strncat(arr1, arr2, 3);printf(%s\n, arr1);//abcdef\0return 0;
}探究’\0’的追加情况2
#include stdio.h
#include string.h
int main()
{char arr1[20] abc\0xxxxxxxxxxx;//字符串中本身具备\0时依然以\0开始覆盖最后补\0结束char arr2[] defghi;strncat(arr1, arr2, 10);//10长度比str2长时自动在末尾补\0.此函数就不会对超出长度的字符进行操作了printf(%s\n, arr1);//abcdefreturn 0;
}1.7、strncmp函数
功能字符串大小比较可指定长度 原型int strncmp( const char *string1, const char *string2, size_t count ); 头文件string.h
#include stdio.h
#include string.h
int main()
{char arr1[] abcdef;char arr2[] abcqw;//int ret strncmp(arr1, arr2, 3);//printf(%d\n, ret);//0int ret strncmp(arr1, arr2, 4);//比较字符串前4个字符printf(%d\n, ret);//-1return 0;
}1.8、strstr函数
功能在字符串中找字符串字符串中找子字符串或着段strstr会返回str1中str2第一次出现的位置如果str1中没有str2则返回NULL 原型const char *strstr( const char *string, const char *strCharSet ); 头文件string.h
#include stdio.h
#include string.hint main()
{char arr1[] abcdefghi;char arr2[] def;char* ret strstr(arr1, arr2);if (ret NULL){printf(找不到\n);}else{printf(%s\n, ret);//defghi}return 0;
}1.9、strtok函数
功能常用于切割字符串 原型char *strtok( char *strToken, const char *strDelimit ); 头文件string.h
注意 strtok函数找到str中的下一个标记并将其用’\0’,结尾返回一个指向这个标记的指针 strtok函数会改变被操作的字符串所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。 比如 IP地址本来是一个无符号的整数这种整数不方便记忆所以将这个整数转换成点分十进制的表示方式 abcdefyeah.net – 分隔符可以是或 ’ . ’ 192.168.101.23 – 分隔符可以是 ’ . ’
#include stdio.h
#include string.hint main()
{char arr[] abcdefyeah.net;char* p .;char* s strtok(arr, p);//将被标记的地方改为\0,再把\0之前的切分出来。printf(%s\n, s);return 0;
}小结在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改 如下所示利用一个新数组保存原数组数据
#include stdio.h
#include string.hint main()
{char arr[] abcdefyeah.net;char buf[200] { 0 };strcpy(buf, arr);char* p .;char* s strtok(buf, p);//将被标记的地方改为\0,再把\0之前的切分出来。printf(%s\n, s);return 0;
}小结 strtok函数的第一个参数为NULL函数将在同一个字符串中被保存的位置开始查找下一个标记。 如果字符串中不存在更多的标记则返回NULL指针。
如下所示每次调用都会保存上次调用的标记具备记忆功能依次类推
#include stdio.h
#include string.hint main()
{char arr[] abcdefyeah.net;char buf[200] { 0 };strcpy(buf, arr);char* p .;char* s strtok(buf, p);//将被标记的地方改为\0,再把\0之前的切分出来。printf(%s\n, s);s strtok(NULL, p);printf(%s\n, s);s strtok(NULL, p);printf(%s\n, s);return 0;
}
为了代码的实用性以循环的方式依次识别标记对代码进行优化
#include stdio.h
#include string.hint main()
{char arr[] abcdefyeah.net;char buf[200] { 0 };strcpy(buf, arr);char arr2[] 192.168.101.23;char buf2[200] { 0 };strcpy(buf2, arr2);char* p .;char* s NULL;for (s strtok(buf, p); s ! NULL; s strtok(NULL, p)){printf(%s\n, s);}char* p2 .;for (s strtok(buf2, p2); s ! NULL; s strtok(NULL, p2)){printf(%s\n, s);}return 0;
}小结 1.strtok函数找到str中的下一个标记并将其用\0结尾返回一个指向这个标记的指针。 2.strtok函数的第一个参数不为NULL函数将找到str中第一个标记strtok函数将保存它在字符串中的位置 3.strtok函数的第一个参数为NULL函数将在同一个字符串中将被保存的位置开始查找下一个标记。 4.如果字符串中不存在更多的标记则返回标记为NULL指针
1.10、strerror函数
功能是将错误码翻译成错误信息返回错误信息的字符串的起始地址 原型char *strerror( int errnum ); 头文件string.h
错误码比如常见网页打不开显示-404- C语言中使用库函数的时候如果发生错误就会将错误码放在errno的变量中errno是一个全局变量可以直接使用的
#include stdio.h
#include string.h
int main()
{int i 0;for (i 0; i 10; i){printf(%d: %s\n, i, strerror(i));}return 0;
}strerror函数常用于文件的操作判定 以打开文件的例子展示 fopen以读的形式打开文件如果文件存在打开成功如果文件不存在打开失败。
#include stdio.h
#include string.hint main()
{FILE* pf fopen(add.txt, r);if (pf NULL){printf(打开文件失败原因是%s\n,strerror(errno));return 1;}else{printf(打开文件成功\n);}return 0;
}对比perroe函数 原型void perror( const char *string ); 功能直接打印错误码所对应的错误信息(先打印自定义信息xxx,再直接打印错误原因) 等价perror printf strerror
#include stdio.h
#include string.hint main()
{FILE* pf fopen(add.txt, r);if (pf NULL){perror(打开文件失败);return 1;}else{printf(打开文件成功\n);}return 0;
}2、字符分类函数 字符分类函数 iscntrl – 任何控制字符 isspace – 空白字符‘空格’换页’\f’回车’\n’制表符’\t’… 较常用 isdigit — 十进制数字0~9 isxdigit – 十六进制数字 包括十进制数字小写字母af,大写字母AF islower — 小写字母a~z isupper — 大写字母A~Z isalpha – 字母az或AZ isalnum – 字母或数字 az,AZ,0~9 ispunct – 标点符号任何不属于数字或者字母的图形字符 isgraph – 任何图形字符 这里以常见的为例
2.1、islower函数
原型int iswlower( wint_t c ); 头文件ctype.h 功能判断字符是否为小写字母如果为小写则返回非零的值如果不是小写则返回0
#include stdio.h
#include ctype.hint main()
{char ch a;if (islower(ch)){printf(是小写\n);}else{printf(不是小写\n);}return 0;
}2.2、isdigit 和 isxdight函数
原型int isdigit( int c ); 头文件ctype.h 功能判断字符是否为十进制数字0~9
原型int isxdigit( int c ); 头文件ctype.h 功能判断字符是否为十六进制数字 包括十进制数字小写字母af,大写字母AF
#include stdio.h
#include ctype.h
int main()
{//if(ch a ch z)int ret islower(a);printf(%d\n, ret);int ret2 isdigit(5);printf(%d\n, ret2);int ret3 isxdigit(c);printf(%d\n, ret3);return 0;
}2.3、islower 和 isupper函数
原型int islower( int c ); 头文件ctype.h 功能判断字符是否为小写字母a~z
原型int isupper( int c ); 头文件ctype.h 功能判断字符是否为大写字母A~Z
#include stdio.h
#include ctype.hint main()
{char ch1 A;char ch2 a;if(islower(ch2))printf(小写字母:%c\n,ch2);if(islower(ch1))printf(大写字母:%c\n,ch1);return 0;
}3、字符转换函数
C语言只有两个字符转换函数tolower 、toupper
3.1、tolower函数
原型int tolower( int c ); 头文件ctype.h 功能将大写字母转换为小写字母
#include stdio.h
#include ctype.hint main()
{char arr[] TEST String.;char* p arr;while (*p){if (isupper(*p)){*p tolower(*p);}p;}printf(%s\n, arr);return 0;
}3.2、toupper函数
原型int toupper( int c ); 头文件ctype.h 功能将小写字母转换为大写字母
#include stdio.h
#include ctype.hint main()
{int ret tolower(A);printf(%c\n, ret);//aint ret2 toupper(a);printf(%c\n, ret2);//Aint ret3 tolower(A);printf(%c\n, ret3);//aret3 toupper(ret3);printf(%c\n, ret3);//Areturn 0;
}4、结语
熟悉各个函数的使用有利于程序的可读性和效率此篇笔记有误的地方请多多指教。 半亩方糖一鉴开天光云影共徘徊。 问渠哪得清如许?为有源头活水来。–朱熹观书有感