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

目录

一,字符分类函数

二,字符转换函数

三,strlen的使用和模拟实现

1,strlen使用

2,模拟实现strlen:

四,strcpy的使用和模拟实现

1,strcpy的使用

2,strcpy的模拟实现

3,strncpy的使用

五,strcat的使用和模拟实现

1,strcat的使用

2,strcat的模拟实现

3,strncat的使用

六,strcmp的使用和模拟实现

1,strcmp的使用

2,模拟实现strcmp

3,strncmp的使用

七,strstr的使用和模拟实现

1,strstr的使用

2,strstr的模拟实现

八,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中必须包含‘\0'

size_t为无符号的整型,再进行计算时易出错。

例:

结果为:>

strlen的返回值为size_t类型,同类型size_t加减的结果也为size_t类型,若两者转化为有符号类型的数据相减,就可以得到-3,但是两者相减后仍是size_t类型,此时要和int类型的数据进行比较,就需要通过补码来计算,得到的值是一个非常大的正数。

具体过程:3的补码加上(-6)的补码得到一个补码,这个补码以无符号类型进行输出就是以无符号类型的规则转化 ,以有符号类型输出就是以有符号类型的转化规则转化。

注意:不同类型的元素比较要先转化为相同的类型

2,模拟实现strlen:

1,计数器方法(定义变量计数,循环就+1,知道遇到’\0‘为止。

2,指针-指针方法 (结尾指针-起始指针)=元素个数

这两种方法在之前的文章中实现过,就不再赘述。

3,递归实现(不创建临时变量)

四,strcpy的使用和模拟实现

1,strcpy的使用

核心功能:实现对字符串的拷贝

头文件:#include <string.h>

语法:char*strcpy(char* str1,const char* str2 );

含义:将str2的字符拷贝到str1中。会覆盖掉str1中原本的内容。

str2必须以‘\0'结尾,因为会将str2的'\0'一同拷贝到str1当中。

str1必须可以修改并且空间必须足够大,能够容纳str2的所有字符。

返回值:返回指向str1的指针

2,strcpy的模拟实现

3,strncpy的使用和实现

strncpy相当于strcpy加一个参数,用来自定义拷贝的数目

语法:char*strncpy(char* str1,const char* str2,size_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的使用和模拟实现

1,strcat的使用

核心功能:实现对字符串的拼接

头文件:#include <string.h>

语法:char* strcat(char* str1,const char* str2)

str1必须有’\0'否则不知道从哪里开始追加,str2也必须有‘\0'

str1必须可以修改,并且空间足够大,能够容纳两者字符串之和。

返回值:返回指向str1的指针。

例子:

结果:输出hello world

2,strcat的模拟实现

3,strncat的使用和实现

追加指定个数的字符到目标字符串的末尾,再添加一个'\0'.

语法:语法:char* strncat(char* str1,const char* str2,size_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; //处理n>str2的字符数的情况 if (*str2 == '\0') { break; } str1++; str2++; } *str1 = '\0'; return ret; }

六,strcmp的使用和模拟实现

1,strcmp的使用

核心功能:实现两个字符串的比较(不能是字符)

头文件:#include <string.h>

语法:int strcmp(const char* str1,const char* str2);

返回值:

当第一个字符串大于第二个字符串时:返回大于0的数(VS中为1)

当第一个字符串等于第二个字符串时:返回0

当第一个字符串小于第二个字符串时:返回小于0的数(VS中为-1)

2,模拟实现strcmp

3,strncmp的使用

指定前num个字符进行比较

语法:int strncmp(const char* str1,const char* str2,size_t num);

如果num大于源字符串,无影响。

七,strstr的使用和模拟实现

1,strstr的使用

核心功能:实现查找一个字符串是否为另一个字符串的子串

头文件:#include <string.h>

语法:char* strstr(const char* str1,const char* str2)

函数返回str2在str1中出现的起始地址,若在str1中找不到str2则返回NULL

如果arr2为”“则会直接打印arr1

2,strstr的模拟实现

八,strtok函数的使用

核心功能:对字符串以分隔符为准,进行分隔。

头文件:#include <string.h>

语法:char* strtok( char* str1,const char* sep )

sep为一个字符串,字符串的内容为分隔符的集合(不考虑顺序)

str1中含有多个sep中的分隔符,strtok函数会把str1中的分隔符变成'\0'

1,当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';