[英]Why does strlen() in this instance return one less than the number I expected?
例:
{
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返回的是我的期望值,但减去了。 这里发生了什么?
当你说
strcat(s1,"L#@");
串联字符串(结果)太长而无法放入s1
。 它超出了有效边界,作为重用,您有未定义的行为 。
您需要确保串联的结果可以保存到目标内存中。 换句话说,您需要确保s1
足够大以容纳的结果
strcat(s1,"L#@");
一种基本的实现方法是通过在编译时指定大小来使目标足够大,例如
#define SIZE 16
....
char s1[SIZE]="ABCDEF";
并相应地使用它。
在这里,我们只是将s1
到足以容纳级联结果的程度。
就是说, strlen()
的返回类型是size_t
,因此您应该使用%zu
来打印结果!
忽略您在字符串末尾写的事实。
在strcpy(s1,s2)
之后strcpy(s1,s2)
s1包含“ ZWXYZ”。
在strcat(s1,"L#@")
s1包含长度为ogf 8的“ ZWXYZL#@”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.