例子:

    {
        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/

10-11 15:19
查看更多