繁体   English   中英

为什么在这种情况下,strlen()返回的值比我预期的要少一个?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM