C语言字符串学习笔记

摘要
C字符串函数,有必要好好学习,对一些字符串的处理,用正确的函数很重要。

  • 获取字符串的长度:strlen 函数
  • 拷贝字符串:strcpy函数和 strncpy函数
  • 连接字符串:strcat 函数和 strncat 函数
  • 比较字符串:strcmp 函数和 strncmp 函数

strcpy字符串复制

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>

int main()
{
char str1[100] = "Original";
char str2[10] = "New";

strcpy(str1, str2);
printf("%s\n", str1);

return 0;
}

结果应该是只打印 New 这个字符串。可能会觉得 str1 的长度比 str2 长,调用 strcpy 函数后会只覆盖前边的内容,后边保留……但事实上并不是这样,因为 strcpy 函数复制 str2 的时候,会将该字符串最后的 ‘\0’ 也一并复制过去。如图:image-20201223201312225

strncpy字符串复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>

int main()
{
char str1[] = "To be or not to be";
char str2[40];
char str3[40];

strncpy(str2, str1, sizeof(str2));
strncpy(str3, str2, 5);
str3[5] = '\0'; //重要!!!!!!!!!!!!!!!!!!!!

printf("%s\n", str1);
printf("%s\n", str2);
printf("%s\n", str3);

return 0;
}

输出为:

1
2
3
To be or not to be
To be or not to be
To be
参数 含义
dest 指向存放字符串的目标数组
src 指向待拷贝的源字符串
n 指定拷贝的最大长度

和 strcpy 函数一样,strncpy(dest, src, n) 函数将拷贝源字符串的 n 个字符到目标数组中。如果源字符串的长度小于 n,那么就用 ‘\0’ 填充额外的空间。如果源字符串的长度大于或等于 n,那么只有 n 个字符被拷贝到目标数组中(注意:这样的话将不会以结束符 ‘\0’ 结尾)。

为了使该函数更“安全”,建议使用 dest[sizeof(dest) - 1] = ‘\0’; 语句确保目标字符串是以 ‘\0’ 结尾.

sizeof运算符&strlen字符串长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main()
{
char str[] = "I love mjclouds.com!";

str[7] = '\0';

printf("sizeof str = %d\n", sizeof(str));
printf("strlen str = %d\n", strlen(str));

return 0;
}

该程序输出sizeof str = 21 strlen str = 7

sizeof 运算符是取得字符串的尺寸,即该字符串所处存储空间的大小。
代码开头的 char str[] = "I love mjclouds.com!" 决定了该字符数组的尺寸。而字符串的长度则是由第一个遇到的结束符(’\0’)所定义的。只要编译器读取到结束符\0,它不管你字符数组后边是否有其它内容,都会认为字符串已经结束。

strcat连接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>

int main()
{
char str1[100] = "Original String";
char str2[] = "New String";

strcat(str1, " ");
strcat(str1, str2);

printf("str1: %s\n", str1);

return 0;
}

输出是:

1
2
str1: Original String New String

**strcat(dest, src) **

参数 含义
dest 指向用于存放字符串的目标数组,它应该包含一个字符串,并且提供足够容纳连接后的总字符串长度的空间(包含结束符 ‘\0’)
scr 指向待连接的源字符串,该参数不应该与 dest 参数指向的位置发生重叠

strcat 函数用于连接两个字符串。

将源字符串拷贝并连接到目标数组存放的字符串后边,此过程将覆盖第一个参数的结束符 ‘\0’。

两个参数的位置不应该重叠。

strncat连接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>

int main()
{
char str1[20] = "I ";
char str2[20] = "love ";
char str3[20] = "FishC.com!";

strncat(str1, str2, 5);
strncat(str1, str3, 10);

printf("str1: %s\n", str1);

return 0;
}

输出为:

1
str1: I love FishC.com!

strncat(dest, src, n)

参数 含义
dest 指向用于存放字符串的目标数组,它应该包含一个字符串,并且提供足够容纳连接后的总字符串长度的空间(包含结束符 ‘\0’)
src 指向待连接的源字符串,该参数不应该与 dest 参数指向的位置发生重叠
n 指定待连接的源字符串的最大长度

strncat 函数用于拷贝源字符串中的 n 个字符到目标数组的字符串后边,并在末尾添加结束符 ‘\0’。

如果源字符串的长度小于 n,那么不会像 strncpy 函数那样使用 ‘\0’ 进行填充(但结束符 ‘\0’ 还是有的)。

另外,目标数组中的原有的字符串并不算在 n 中。

strcmp 比较字符串&strncmp比较字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>

int main() {
char str1[10] = "I love FishC.com";
char str2[20] = "I love mjclouds.com";

if (!strcmp(str1, str2)) {
printf("两个字符串完全一致!\n");
} else {
printf("两个字符串不同!\n");
}
if (!strncmp(str1, str2, 7)) {
printf("两个字符串前7个字符完全一致!\n");
} else {
printf("两个字符串前7个字符不同!\n");
}

return 0;
}

输出为:

1
2
两个字符串不同!
两个字符串前7个字符完全一致!

strcmp(s1, s2)

(str1, str2, n)

参数 含义
s1 指向待比较的字符串 1
s2 指向待比较的字符串 2
n 指定待比较的字符数

strcmp 函数用于比较两个字符串。

该函数从第一个字符开始,依次比较每个字符的 ASCII 码大小,直到发现两个字符不相等或抵达结束符(’\0’)为止。

返回值<0,意思是 字符串 1 的字符小于字符串 2 对应位置的字符;

返回值=0,意思是 字符串 1 的字符等于字符串 2 对应位置的字符;

返回值>0,意思是 字符串 1 的字符大于字符串 2 对应位置的字符;



strncmp 函数用于比较两个字符串的前 n 个字符。

该函数从第一个字符开始,依次比较每个字符的 ASCII 码大小,发现两个字符不相等或抵达结束符(’\0’)为止,或者前 n 个字符完全一样,也会停止比较。

返回值类型同strcmp

参考文章:
参考链接


C语言字符串学习笔记
https://wujunyi792.github.io/2020/12/23/C语言字符串学习笔记/
作者
Wujunyi
发布于
2020年12月23日
许可协议