文章目录
前言
哈喽,读者朋友你好,这一章主要讲解字符分类函数、字符转换函数以及各种字符串函数。制作不易请点个关注。
一、字符分类函数
C语言中有一系列是做字符分类的,也就是一个字符是属于什么类型的字符的。
需要头文件 <ctype.h>

以isupper为例,其他函数类似:
int isupper(int c);
这个isupper是判断c是不是大写字母,是的话则返回一个非0的值,不是的话则返回一个0。
接下来解释一下为什么参数部分是int类型而不是char类型
用char类型的话(-128~127)装不下127之后的范围,用unsigned char(0~255)则装不下EOF(-1),所以用int类型是为了装下所有“合法字符”和文件结束标识符(EOF)
二、字符转换函数
int tolower(int c); //将参数传进去的⼤写字⺟转⼩写
int toupper(int c); //将参数传进去的⼩写字⺟转⼤写
返回值会传出来转换的字母
上面参数的范围和分类函数同理
strlen函数的使用
语法形式:
size_t strlen ( const char * str );
strlen返回的是‘\0’之前的字符个数。
字符串必须以‘\0’结束,要不然结果是随机的。
需要包含头文件<string.h>
它的返回类型是无符号整形的,两个无符号整形相减,最后结果是无符号整形的。
长度不受限的
1.strcpy函数的使用和模拟实现
功能:字符串拷贝,把源头字符串拷贝到目标字符串中(也就是源头覆盖目的)
语法形式:
char* strcpy(char * arr1; const char * arr2);
char * arr1:目标字符串
const char * arr2:源头字符串(把这个拷贝到目的字符串中)
例:strcpy(arr1,arr2)(把arr2拷贝到arr1中)
返回值:返回目的字符串的起始位置
!!注意:
1.源头字符串必须以‘\0’结尾
2.会把‘\0’也拷贝过去
3.目标空间足够大,并且可修改。
strcpy的模拟实现:
char* mystrcpy(char* arr1, const char* arr2)
{
char* a = arr1;
assert(arr1 != NULL);
assert(arr2 != NULL);
while (*arr1++ == *arr2++)
{
;
}
return a;
}
2.strcat函数的使用和模拟实现
功能:把源头字符串所有字符追加到目标字符串的空间中
语法形式:
char* strcat(char * arr1, const char * arr2 );
char * arr1:目标字符串
const char * arr2:源头字符串
例:strcpy(arr1,arr2)(把arr2放到arr1的后面)
返回值:返回目标空间的起始地址
!!注意:
1.目标空间足够大,可修改
2.源头字符串必须以‘\0’结尾
3.目标字符串必须以‘\0’结尾,源头字符串是从‘\0’开始的(覆盖‘\0’)
模拟实现:
char* mystrcat(char* arr1, const char* arr2)
{
char* a = arr1;
assert(arr1 != NULL);
assert(arr2 != NULL);
while (*arr1)
arr1++;
while (*arr1++ == *arr2++)
{
;
}
return a;
}
3.strcmp函数的使用和模拟实现
功能:比较arr1和arr2两个字符串的大小,从两个字符串第一个字符开始,如果ASCII码值相等就比较下一个。
返回值:
arr1>arr2 返回大于0的数字
arr1<arr2 返回小于0的数字
arr1=arr2 返回0
strcmp的模拟实现:
char* mystrcat(char* arr1, const char* arr2)
{
assert(arr1 != NULL);
assert(arr2 != NULL);
while (*arr1 == *arr2)
{
if (*arr1 == '0')
return 0;
arr1++;
arr2++;
}
return arr1 - arr2;
}
长度受限的
1.strncpy函数的使用
语法形式:
char * strncpy ( char * arr1, const char * arr2, size_t num );
拷贝n个字符到目标字符串中
char * arr1:目标字符串
const char * arr2:源头字符串
size_t num:拷贝num个字符
返回值:返回目标空间的起始位置。
strncpy(arr1,arr2,5);//如果arr2不够5个字符,剩余的补‘\0’;如果arr2数目大于5,只把前5个拷贝过去,结尾不加‘\0’。
char arr2[10]=“abc\0def”;//源头字符串中间有个\0(num为3的话,这个\0会被拷贝),如果num大于4的话,拷贝到\0就停止,剩下的补充\0
2.strncat函数的使用
语法形式:
char * strncat ( char * arr1, const char * arr2, size_t num );
将arr2中的字符追加到arr1中,最多追加num个。
char * arr1:目标字符串
const char * arr2:源头字符串
size_t num:追加num个字符
返回值:返回目标空间的起始位置。
追加完之后末尾自动补\0.
当num>arr2的有效字符串部分
例:char arr2[5]=“ABC”;//只追加arr2的全部部分(包括\0)不会填充额外的\0.
3.strncmp函数的使用
语法形式:
int strncmp ( const char * str1, const char * str2, size_t num );
比较arr1和arr2的前num个字符,相等就往后比较,知道比较完前num个字符。
提前不一样就提前结束,如果num个字符一样就返回0
返回值:
arr1>arr2 返回大于0的数字
arr1<arr2 返回小于0的数字
arr1=arr2 返回0
strstr函数的使用和模拟实现
功能:在第一个字符串中找另一个字符串第一次出现的位置,如果找不到,则返回NULL。
语法形式:
char * strstr ( const char * str1, const char * str2);
返回值:找到的话,返回第一次找到的起始位置。
模拟实现:
char* strstr(const char* str1, const char* str2)
{
char* cp = (char*)str1;
char* s1, * s2;
if (!*str2)
return((char*)str1);
while (*cp)
{
s1 = cp;
s2 = (char*)str2;
while (*s1 && *s2 && !(*s1 - *s2))//判断str1和str2是不是\0和
//两个是不是相等
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return (NULL);
}
strtok函数的使用
语法形式:
char * strtok ( char * str, const char * sep);
sep:是放分隔符的字符串
str:目标字符串的字符中,可能分开放在一些分隔符,会把sep中的分隔符换成\0,因此原字符串会被修改。
strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串的位置。
第一个参数为NULL时,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
传NULL是因为strtok内部会记录上次分割的位置。
以字符串 char str[] = “猫,狗,鸟” 为例,整个拆分过程的内存和返回值变化:
-
初始内存: ‘猫’ ‘,’ ‘狗’ ‘,’ ‘鸟’ ‘\0’ (原字符串,末尾有天然 \0 );
-
第一次调用 strtok(str, “,”) :
-
把第一个逗号改成 \0 ,内存变为 ‘猫’ ‘\0’ ‘狗’ ‘,’ ‘鸟’ ‘\0’ ;
-
返回“猫”的起始地址;
-
内部书签记录在 ‘\0’ 的下一个位置(即“狗”的起始地址)。
- 第二次调用 strtok(NULL, “,”) :
-
从书签位置找,把第二个逗号改成 \0 ,内存变为 ‘猫’ ‘\0’ ‘狗’ ‘\0’ ‘鸟’ ‘\0’ ;
-
返回“狗”的起始地址;
-
书签更新到第二个 ‘\0’ 的下一个位置(即“鸟”的起始地址)。
- 第三次调用 strtok(NULL, “,”) :
-
从书签位置找,后面没有逗号了,直接找到字符串末尾的天然 \0 ;
-
返回“鸟”的起始地址;
-
书签更新到天然 ‘\0’ 的下一个位置(超出字符串范围)。
- 第四次调用 strtok(NULL, “,”) :
-
从书签位置(超出字符串)开始找,没有任何非分隔符的有效字符;
-
触发终止条件,返回 NULL
strerror函数的使用
语法形式:
char* strerror (int errnum);
errnum:错误码。(一般是errno)。
strerror函数可以通过参数部分的errnum表示错误码,得到对应的错误信息,并且返回这些错误信息字符串首字符的地址。
perror函数的实现
语法形式:
void perror (const char *str);
直接将错误信息打印出来。
例:perror(“text”);/打印text:错误信息;
错误信息之前的可以自定义。
总结
上面这些函数只能用于字符类型,看到这里如果有什么不懂的,评论区私我,或者发信息,制作不易求个关注
748

被折叠的 条评论
为什么被折叠?



