例子:
{
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。我希望斯特伦能回到9号。我想这一定是罪魁祸首。但是,当我删除#时,它返回7,好像#被计算在内。所以,看起来斯泰伦正在返回我所期望的结果,但只有一个。这是怎么回事?
最佳答案
当你说
strcat(s1,"L#@");
连接的字符串(结果)太长,无法放入
s1
。它超出了有效边界,作为重用,您有undefined behavior。您需要确保连接的结果可以保存在目标内存中。换句话说,您需要确保
s1
足够大,可以容纳 strcat(s1,"L#@");
实现这一点的一个基本方法是通过在编译时指定大小使目标足够大,比如
#define SIZE 16
....
char s1[SIZE]="ABCDEF";
以及,相应地使用它。
在这里,我们只是使
s1
大到足以容纳连接的结果。也就是说,
strlen()
的返回类型是size_t
,因此您应该使用%zu
来打印结果!关于c - 为什么在这种情况下strlen()返回的值比我预期的少1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47389731/