【C语言】字符函数(strlen、strcpy、strcmp、strerror)

目录

一、strlen 函数

二、strcpy 函数

三、strcmp函数

四、strerror 函数


这里仅列举出了部分需要注意的函数,至于其他的 strcat、strtok函数没有列举出来。

一、strlen 函数

strlen 函数用于获取一个字符串的长度。本质是用一个变量cnt计数,只要不是'\0',cnt++,地址也向后移动一个单位;一旦遇到 '\0',停止计数并返回计数结果。

函数声明如下:

1、形参返回值解析

形参:输入一个 char* 类型,相当于提供字符串首元素的地址

返回值:返回你输入的字符串的长度

2、函数特点

(1) strlen 返回字符串中 '\0' 前面出现的字符数

'\0' 作为字符串的结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )

char* str1 = "hello";    // 5,注意末尾有个隐藏的'\0'

char str2[] = "hello";   // 5

char str2[] = {'h','e','l','l','o','\0'};   // 5

char str2[] = {'h','e','l','l','o','\0','a','b','c'};   // 5,一遇到'\0',函数就会返回

char str2[] = {'h','e','l','l','o'};   // 长度不确定,因为没有'\0',因为数组不会自动补充

(2) strlen函数的返回值是无符号整型

strlen函数的返回值是size_t,即unsigned int

int main() {
	const char* pstr1 = "hello,world";
	const char* pstr2 = "hello";
	

	if (strlen(pstr2) - strlen(pstr1) > 0)
	{
		printf("大于");
	}
	else
	{
		printf("小于等于");
	}
	return 0;
}

无符号整型相减的结果依然是无符号整型,但strlen(pstr2) - strlen(pstr1) 的结果是 -6,所以这个 -6 在比较大小的时候需要倾向于范围较小的那一方,即转换成无符号类型。

-6 在内存中的补码为 10000000 00000000 00000000 00000110,现在要当作无符号来看,即所有的位置都是有效位,转换成原码就是

01111111 11111111 11111111 11111010

很显然这个数是 大于 0的,所以打印的结果是“大于”

二、strcpy 函数

strcpy函数 将源字符串里的所有字符(包括'\0')逐个拷贝到目标空间。拷贝时一旦遇到‘ \0 ’,此时会中止拷贝,先把'\0' 拷贝到目标地址, 然后再返回目标地址。

函数声明如下:

1、形参返回值解析

第一个参数:目标空间的地址,可以是一个数组首元素的地址,也可以是malloc出来的地址

第二个参数:源字符串首元素的地址

返回值:返回目标空间的地址

2、函数特点

函数有以下两点需要注意:

  • strcpy 函数会将源字符串中的 '\0' 拷贝到目标空间
  • 目标空间必须足够大,以确保能放下源字符串

3、函数使用

int main() {
	char src[20] = { 'h','e', 'l', 'l', 'o', '\0','a','b','c' };
	char dst[20];

	strcpy(dst, src);

	return 0;
}

 这也从侧面证实了,strcpy 遇到'\0' 会停止拷贝,但是会把'\0'拷贝到目标空间。

三、strcmp函数

strcmp 函数可以比较两个字符串的大小。本质上是逐字节比较,即便是比较汉字,一个汉字占2个字节,也是先将汉字存到内存,然后逐字节比较。

函数声明如下:

1、参数返回值解析

参数介绍:输入的是需要用来比较的两个参数,可以是数组首元素地址,也可以是字符串首元素地址。

返回值:

  • 左边 > 右边,返回大于0的数字(不一定返回的就是1)
  • 左边 = 右边,返回0
  • 左边 < 右边,返回小于0的数字(不一定返回的就是-1)

2、函数特点

这里需要注意strcmp 什么时候会停止比较:

(1) 两者之一遇到 '\0' 

两个字符串只要其中一个先遇到 '\0',后面就停止比较,此时会让 '\0' 参与比较

int main() {
	char* str1 = "ab";
	char* str2 = "abcd";

	int ret = strcmp(str1, str2);
	printf("比较结果为: %d\n", ret);

	return 0;
}

 str1先遇到'\0',此时会把 '\0' 和 'c' 比较,结果是 ‘c’ 更大,所以返回结果是 -1

(2) 在遇到'\0' 之前就分出大小

int main() {
	char* str1 = "abdd";
	char* str2 = "abcd";

	int ret = strcmp(str1, str2);
	printf("比较结果为: %d\n", ret);

	return 0;
}

两个字符串比较到第2个位置的时候,'d' 因为大于 'c',所以结果是str1更大,返回结果为1

四、strerror 函数

strerror 函数获取 系统错误码对应的错误信息。当调用库函数出错的时候,错误码会存在变量errno 中,要使用该变量需引入errno.h 头文件。

1、参数返回值解析

第一个参数:错误码errno

返回值:返回 系统错误码对应的错误信息

2、函数使用

int main() {
	FILE* fd = fopen("a.txt", "r");
	if (fd == NULL)
	{
		printf("错误信息为: %s\n", strerror(errno));
		return -1;
	}

	return 0;
}

因为a.txt 不存在,所以这里肯定会打开失败。其实C还给我们提供了一个更直接的函数 perror,使用这个函数可以直接打印错误提示信息。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值