目录
这里仅列举出了部分需要注意的函数,至于其他的 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,使用这个函数可以直接打印错误提示信息。