#include <stdio.h>
#include <string.h>
void main()
{
char a[8] = "hello";
char b[8] = "HELLO";
int x = strcmp(a,b);
printf("%s \n%s \n", a, b);
printf("%s\n", strcat(a,b));
printf("%d", strlen(strcat(a,b)));
}
打印出来:
您好
您好
helloHELLO
12
为什么12?
但如果我有这个:
#include <stdio.h>
#include <string.h>
void main()
{
char a[8] = "hello";
char b[8] = "HELLO";
int x = strcmp(a,b);
printf("%s \n%s \n", a, b);
//printf("%s\n", strcat(a,b));
printf("%d", strlen(strcat(a,b)));
}
打印出来:
你好
你好
10
有人可以解释为什么这里的长度不同吗?我觉得这是“\ 0”字符。
答案 0 :(得分:3)
strcat
修改第一个参数指向的字符串。也就是说,第二个参数表示的字符串将附加到第一个参数的字符串中。
您的char a[8] = "hello";
是5个字符,加上空值加上两个未使用的字节。然后b
在内存中跟随它。
在`strcat:
之前a: h e l l o \0 _ _
b: H E L L O \0 _ _
首先strcat
:
a: h e l l o H E L
b: L O \0 L O \0 _ _
现在a
已覆盖到b
,b
指向字符串&#34; LO&#34;本质上。
现在第二个strcat
正在连接&#34; LO&#34; to&#34; helloHELLO&#34;。在第二个strcat
之后:
a: h e l l o H E L
b: L O L O \0 \0 _ _
请注意第二个a
之后strcat
处的字符串长度为12个字节:&#34; helloHELLOLO&#34;。
在第二个测试用例中,您删除了第一个strcat
,因此您看到了正常输出的内容。但是,当您使用strcat
时,必须确保您的接收缓冲区(第一个参数)有足够的空间来容纳整个连接字符串加上null。使用C库函数时,建议您阅读手册页。有关详细信息,请参阅man strcat
。