示例:
{
int a,b;
char s1[]="ABCDEF";
char s2[]="ZWXYZ";
strcpy(s1,s2);
strcat(s1,"L#@");
a=strlen(s1);
b=strlen(s2);
printf("%d%d",a,b);
}
返回8和5.我希望strlen返回9.我认为#或@必须是这里的罪魁祸首。但是,当我删除#时,它返回7,就好像#被计算一样。所以,似乎strlen正在回归我所期望的但却减去一个。这是怎么回事?
答案 0 :(得分:5)
当你说
时 strcat(s1,"L#@");
连接字符串(结果)太长而无法放入s1
。它用完了有效的边界,作为一个重复,你有undefined behavior。
您需要确保连接的结果可以保存到目标内存中。换句话说,您需要确保s1
足够大以容纳
strcat(s1,"L#@");
实现这一目标的基本方法是通过在编译时指定大小来使目标足够大,例如
#define SIZE 16
....
char s1[SIZE]="ABCDEF";
并且,相应地使用它。
在这里,我们只是让s1
大到足以保持连接的结果。
也就是说,strlen()
的返回类型为size_t
,因此您应该使用%zu
来打印结果!
答案 1 :(得分:0)
忽略你在字符串末尾写字的事实......
strcpy(s1,s2)
s1包含" ZWXYZ"。
strcat(s1,"L#@")
s1包含" ZWXYZL#@"其长度为ogf 8