
目录1. 字符分类函数2. 字符转换函数3. 字符串相关函数3.1 strlen3.2 strcpy 和 strncpy3.2.1 strcpy3.2.2 strncpy3.3 strcat 和 strncat3.3.1 strcat3.3.2 strncat3.4 strcmp 和 strncmp3.4.1 strcmp3.4.2 strncmp3.5 strstr3.6 strtok3.7 strerror1. 字符分类函数顾名思义字符分类函数就是用于分类各种类型的字符以便于后续操作。以下是一些常见的字符分类函数iscntrl控制字符isspace空白字符如空格 换行 \n制表符 \t换页 \f回车 \r垂直制表符 \visdigit十进制数isxdigit十六进制数isalpha大、小写字母islower小写字母isupper大写字母isalnum字母或数字ispunct标点符号任何不属于字母或数字的图形字符isgraph任何图形字符isprint任何可打印字符包括图形字符和空白字符2. 字符转换函数在C语言中除了将小写字母的ASCII码值减去32得到对应大写字母的ASCII码值我们还可以用以下两个函数实现大小写转换int tolower(int a); //大写转小写 int toupper(int b); //小写转大写需要注意的是函数的返回值为对应字母的ASCII码值。3. 字符串相关函数3.1 strlen使用前须添加头文件string.hsize_t strlen (const char * str);用法统计字符串中 \0 之前的字符个数。参数str为需要统计长度的字符串指针。返回值返回str指向的字符串长度为无符号整数size_t。注意事项字符串必须有结束标志 \0 。strlen统计的是 \0 之前的字符个数包括任何有效字符如空格不包括\0 。返回值size_t类型是无符号的。使用示例#includestdio.h #includestring.h int main() { char arr[20] {hello world}; int sz strlen(arr); printf(%d, sz); return 0; }* 模拟实现strlen方法一指针位移int my_strlen(const char * str) { assert(str); int cnt 0; while(*str) { cnt; str; } return cnt; }方法二递归int my_strlen(const char * str) { assert(str); if(*str \0) return 0; else { return 1 my_strlen(str 1); //可以写前置str但不可用后置str } }3.2 strcpy 和 strncpy3.2.1 strcpy使用前须添加头文件string.hchar * strcpy (char * destination, const char * source);用法可以对指定的字符串进行拷贝存放。参数destination为存放目标处的指针source为拷贝源头的指针。返回值拷贝完成时返回目标空间的起始地址。注意事项拷贝源头的字符串必须以 \0 作为结束标志。拷贝源头字符串的 \0 也会一并拷贝。目标空间必须足够大可被修改。使用示例#includestdio.h #includestring.h int main() { char arr1[10] {hello}; char arr2[20] {0}; strcpy(arr2, arr1); printf(%s, arr2); return 0; }* 模拟实现strcpychar * my_strcpy(char * dst, const char * src) { assert(dst); assert(src); char * dst2 dst; while(*src ! \0) { *dst *src; dst; src; } //记得在dst末尾补充src所指向的\0 *dst *src; return dst2; }3.2.2 strncpy使用前须添加头文件string.hchar * strncpy(char * destination, const char * source, size_t num);用法可以对指定长度的字符串进行拷贝存放。参数在strcpy的基础上增加了需要拷贝的字节数num。其余部分与strcpy的用法大致相同这里不作过多赘述。与strcpy相比strncpy指定了拷贝的长度使得即使拷贝源头没有 \0 也可以正常使用更加安全。使用示例#includestdio.h #includestring.h int main() { char arr1[15] {hello worldxx}; char arr2[20] {0}; strncpy(arr2, arr1, 11); printf(%s, arr2); return 0; }3.3 strcat 和 strncat3.3.1 strcat使用前须添加头文件string.hchar * strcat (char * destination, const char * source);用法将源字符串追加到指定的字符串后。参数destination为追加目标处的指针source为源头数据的指针。返回值追加完成时返回目标空间的起始地址。注意事项源字符串必须以 \0 结尾否则会有越界风险。目标空间必须也有 \0 否则无法确定追加起点追加时源字符串的第一个元素会覆盖追加起点的 \0 。目标空间必须足够大可被修改。使用示例#includestdio.h #includestring.h int main() { char arr1[15] {hello world}; char arr2[30] {haha }; strcat(arr2, arr1); printf(%s, arr2); return 0; }3.3.2 strncat使用前须添加头文件string.hchar * strncat (char * destination, const char * cource, size_t num);用法可以对指定长度的字符串进行追加。参数在strcpy的基础上增加了需要追加的字符数num。返回值追加完成时返回目标空间的起始地址。注意事项追加结束会自动添加 \0 即使未主动追加 \0 。如果num超出了源字符串长度则会忽略掉。使用示例#includestdio.h #includestring.h int main() { char arr1[15] {hello world}; char arr2[30] {haha }; strncat(arr2, arr1, 5); printf(%s, arr2); return 0; }3.4 strcmp 和 strncmp3.4.1 strcmp使用前须添加头文件string.hint strcmp (const char * str1, const char * str2);用法比较两个字符串从两个字符串的第一个字符开始比较如果两个字符的ASCII码值相等就比较下一个字符直至遇到不相等的字符或者字符串结束。参数str1str2为两个字符串对应的指针。返回值若str1大于str2返回大于0的整数若str1等于str2返回0若str1小于str2返回小于0的整数。使用示例#includestdio.h #includestring.h int main() { char str1[15] {hello C}; char str2[15] {hello world}; int ret strcmp(str1, str2); printf(%d, ret); //由于C的ASCII码值小于w所以打印结果为负整数 return 0; }3.4.2 strncmp使用前须添加头文件string.hint strncmp (char * str1, char * str2, size_t num);用法比较两个字符串中指定长度的大小。参数在strcmp的基础上增加了num是比较的字符数。返回值与strcmp的规则相同。与strcmp相比strncmp指定了比较的长度更加灵活、安全。使用示例#includestdio.h #includestring.h int main() { char str1[15] {hello C}; char str2[15] {hello world}; int ret strncmp(str1, str2, 5); printf(%d, ret); //由于两个字符串的前5个字符相同故返回0 return 0; }3.5 strstr使用前须添加头文件string.hchar * strstr (const char * str1, const char * str2);用法在一个字符串中查找子字符串。参数str1为被查找的字符串指针str2为需要查找的子字符串指针。返回值若查找成功则返回第一次出现位置的指针否则返回NULL。若要以%s输出返回值的指针则将会打印 \0 之前的所有字符。使用示例#includestdio.h #includestring.h int main() { char str2[15] {hello}; char str1[15] {hello world}; char * ret strstr(str1, str2); if(ret ! NULL) { printf(%s\n, ret); } else { printf(您所查找的字符串不存在。\n); } //输出结果为hello world return 0; }3.6 strtok使用前须添加头文件string.hchar * strtok (char * str, const char * delim);用法根据指定的分割字符delim将str分割成一个个子字符串并且原字符串中的分割符会用 \0 代替。参数str为需要分割的字符串delim为指定的分割字符可连续传入多个字符。返回值成功时返回当前子字符串的指针否则返回NULL。使用步骤首次调用需要传入待分割字符和分隔符后续调用传入NULL和分隔符当返回NULL时分割完成。注意事项调用过程中会修改原字符串可通过拷贝原字符串避免。对于连续的分隔符strtok会一并跳过。不可传入空指针作为字符串。使用示例#includestdio.h #includestring.h int main() { char arr[] hello.#worldni hao C yu.yan.; const char * str NULL; //置空避免野指针 char cpy[30] {0}; strcpy(cpy, arr); //将str中的字符串拷贝到cpy中方便后续对cpy进行切割 const char * sep #. ; //确定切割字符 for(str strtok(arr, sep); str ! NULL; str strtok(NULL, sep)) { printf(%s\n,str); } return 0; }值得一提的是如果子字符串较多上述for循环的使用方式可以大大减少代码量初始化部分对arr进行首次传参判断条件部分设置为当str为NULL的时候停止循环增量部分将arr的部分用NULL取代保证了后续调用时传参的准确性。3.7 strerror使用前须添加头文件string.hchar * strerror (int errnum);用法当库函数调用发生错误时可以查看错误信息。参数errnum表示错误信息对应的整数一般使用C语言程序中自带的全局变量errno。返回值错误信息字符串中首字符的地址。注意事项关于errno调用时须添加头文件errno.h初始值为0程序运行过程中若出错则会更新为错误码。一般有以下几种错误码和对应的错误信息0No error1Operation not permitted2No such file on dictionary3No such process4Interrupted function call5Input/output error6No such divice or address7Arg list too long8Exec format error9Bad file descriptor10No child processes2. strerror仅支持在标准库中的函数出错后进行错误码转换。3. 更加便捷的方式perror函数。可以省去引用errno和strerror直接输出对应的错误信息。返回值为参数部分的字符串一个冒号加一个空格错误信息。使用示例#includestdio.h #includestring.h #includeerrno.h int main() { FILE * pfile NULL; pfile fopen(unexist.ent,r) //以只读模式打开文件unexist.ent if(pfile NULL) { printf(错误信息是%s\n, strerror(errno)); //或者替换为 //perror(错误信息是); return 1; } return 0; }