全网最详细C语言的字符函数和字符串函数讲解,干货满满

2025博客之星年度评选已开启 10w+人浏览 1.4k人参与


前言

哈喽,读者朋友你好,这一章主要讲解字符分类函数、字符转换函数以及各种字符串函数。制作不易请点个关注。

一、字符分类函数

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[] = “猫,狗,鸟” 为例,整个拆分过程的内存和返回值变化:

  1. 初始内存: ‘猫’ ‘,’ ‘狗’ ‘,’ ‘鸟’ ‘\0’ (原字符串,末尾有天然 \0 );

  2. 第一次调用 strtok(str, “,”) :

  • 把第一个逗号改成 \0 ,内存变为 ‘猫’ ‘\0’ ‘狗’ ‘,’ ‘鸟’ ‘\0’ ;

  • 返回“猫”的起始地址;

  • 内部书签记录在 ‘\0’ 的下一个位置(即“狗”的起始地址)。

  1. 第二次调用 strtok(NULL, “,”) :
  • 从书签位置找,把第二个逗号改成 \0 ,内存变为 ‘猫’ ‘\0’ ‘狗’ ‘\0’ ‘鸟’ ‘\0’ ;

  • 返回“狗”的起始地址;

  • 书签更新到第二个 ‘\0’ 的下一个位置(即“鸟”的起始地址)。

  1. 第三次调用 strtok(NULL, “,”) :
  • 从书签位置找,后面没有逗号了,直接找到字符串末尾的天然 \0 ;

  • 返回“鸟”的起始地址;

  • 书签更新到天然 ‘\0’ 的下一个位置(超出字符串范围)。

  1. 第四次调用 strtok(NULL, “,”) :
  • 从书签位置(超出字符串)开始找,没有任何非分隔符的有效字符;

  • 触发终止条件,返回 NULL

strerror函数的使用

语法形式:
char* strerror (int errnum);
errnum:错误码。(一般是errno)。
strerror函数可以通过参数部分的errnum表示错误码,得到对应的错误信息,并且返回这些错误信息字符串首字符的地址。

perror函数的实现

语法形式:
void perror (const char *str);
直接将错误信息打印出来。
例:perror(“text”);/打印text:错误信息;
错误信息之前的可以自定义。


总结

上面这些函数只能用于字符类型,看到这里如果有什么不懂的,评论区私我,或者发信息,制作不易求个关注

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值