C语言-字符函数和字符串函数 目录一字符分类函数二字符转换函数三strlen的使用和模拟实现1,strlen使用2模拟实现strlen:四strcpy的使用和模拟实现1strcpy的使用2strcpy的模拟实现3,strncpy的使用五strcat的使用和模拟实现1strcat的使用2strcat的模拟实现3strncat的使用六strcmp的使用和模拟实现1strcmp的使用2模拟实现strcmp3strncmp的使用七strstr的使用和模拟实现1,strstr的使用2strstr的模拟实现八strtok函数的使用九strerror函数的使用一字符分类函数字符分类函数用于确定字符的类型。必须包含头文件#include ctype.h这些函数的返回值都是int类型当条件为真时返回随机值当条件为假时返回0。运用例子二字符转换函数大写字母转为小写int tolower(int c);小写字母转为大写int toupper(int c);运用实例三strlen的使用和模拟实现1,strlen使用核心功能实现对字符串中字符个数的计算头文件#include string.h语法size_t strlen(const char* str)注意str中必须包含‘\0size_t为无符号的整型,再进行计算时易出错。例结果为strlen的返回值为size_t类型同类型size_t加减的结果也为size_t类型若两者转化为有符号类型的数据相减就可以得到-3但是两者相减后仍是size_t类型,此时要和int类型的数据进行比较就需要通过补码来计算得到的值是一个非常大的正数。具体过程3的补码加上-6的补码得到一个补码这个补码以无符号类型进行输出就是以无符号类型的规则转化 以有符号类型输出就是以有符号类型的转化规则转化。注意不同类型的元素比较要先转化为相同的类型2模拟实现strlen:1计数器方法定义变量计数循环就1知道遇到’\0‘为止。2指针-指针方法 (结尾指针-起始指针元素个数这两种方法在之前的文章中实现过就不再赘述。3递归实现不创建临时变量四strcpy的使用和模拟实现1strcpy的使用核心功能实现对字符串的拷贝头文件#include string.h语法char*strcpy(char* str1,const char* str2 );含义:将str2的字符拷贝到str1中。会覆盖掉str1中原本的内容。str2必须以‘\0结尾因为会将str2的\0一同拷贝到str1当中。str1必须可以修改并且空间必须足够大能够容纳str2的所有字符。返回值返回指向str1的指针2strcpy的模拟实现3,strncpy的使用和实现strncpy相当于strcpy加一个参数用来自定义拷贝的数目语法char*strncpy(char* str1,const char* str2size_t num);如果num大于源字符串则补充\0到num个strncpy的实现//strncpy的模拟实现 char* My_strncpy(char* str1, const char* str2,int n) { assert(str1 str2);//判空 int i 0; //提前记录防止后续修改无法找回 char* ret str1; for (i 0;i n;i) { *str1 *str2; //当超出时str2为\0 //补充\0到n个 if (*str2 \0) { while (i n)//继续剩下的次数 { *str1 \0; i; str1; } return ret; } str1; str2; } return ret; }五strcat的使用和模拟实现1strcat的使用核心功能实现对字符串的拼接头文件#include string.h语法char* strcat(char* str1,const char* str2)str1必须有’\0否则不知道从哪里开始追加str2也必须有‘\0str1必须可以修改并且空间足够大能够容纳两者字符串之和。返回值返回指向str1的指针。例子结果输出hello world2strcat的模拟实现3strncat的使用和实现追加指定个数的字符到目标字符串的末尾再添加一个\0.语法语法char* strncat(char* str1,const char* str2size_t num)如果num大于源字符串只将源字符串的所有内容包括’\0追加到目标字符串中,不会多补充其他任何字符。同strcat一样。strncat的实现//模拟实现strncat char* My_strncat(char* str1,const char* str2,int n) { assert(str1 str2);//判空 char* ret str1;//记录起始位置 while (*str1 ! \0)//找到\0 { str1; } for (int i 0;i n;i) { *str1 *str2; //处理nstr2的字符数的情况 if (*str2 \0) { break; } str1; str2; } *str1 \0; return ret; }六strcmp的使用和模拟实现1strcmp的使用核心功能实现两个字符串的比较不能是字符头文件#include string.h语法int strcmp(const char* str1,const char* str2);返回值当第一个字符串大于第二个字符串时返回大于0的数(VS中为1当第一个字符串等于第二个字符串时返回0当第一个字符串小于第二个字符串时返回小于0的数VS中为-12模拟实现strcmp3strncmp的使用指定前num个字符进行比较语法int strncmp(const char* str1,const char* str2size_t num);如果num大于源字符串无影响。七strstr的使用和模拟实现1,strstr的使用核心功能实现查找一个字符串是否为另一个字符串的子串头文件#include string.h语法char* strstr(const char* str1,const char* str2)函数返回str2在str1中出现的起始地址若在str1中找不到str2则返回NULL如果arr2为”“则会直接打印arr12strstr的模拟实现八strtok函数的使用核心功能对字符串以分隔符为准进行分隔。头文件#include string.h语法char* strtok( char* str1,const char* sep )sep为一个字符串字符串的内容为分隔符的集合不考虑顺序str1中含有多个sep中的分隔符strtok函数会把str1中的分隔符变成\01当strtok中的第一个字符为str1时返回第一个字符串str1的首元素的地址。2当strtok中的第一个字符为NULL时返回的是下一个\0后面字符串首元素的地址。3如果NULL中不存在更多的分隔符就返回NULL具体运用运用实例九strerror函数的使用核心功能strerror函数可以把参数部分的错误码对应的错误信息的字符串的地址返回回来。头文件#include string.h语法char* strerror(int errnum)运用实例十strcspn函数的使用核心功能从一个字符串的起始部分开始计算该字符串中有多少个字符不在给定的字符集合中当遇到在给定字符集合中的字符时提前跳出并返回前面不在其中的字符个数字节数。头文件#include string.h语法size_t strcspn(const char *s1 , const char *s2)s1进行扫描的字符串s2: 字符集合字符串使用实例替换换行符//定义一个字符数组 char id[20]; printf(请输入要修改的学生学号: ); //从键盘上获得字符但是最后会回车 /n fgets(id, sizeof(id), stdin); //通过strcspn函数找到最后一个字符的下标并进行更改 id[strcspn(id, \n)] \0;