为什么这个实例中的strlen()返回的值比我预期的少?

时间:2017-11-20 10:20:31

标签: c strcat

示例:

    {
        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正在回归我所期望的但却减去一个。这是怎么回事?

2 个答案:

答案 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