Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在这个实例中strlen()返回的数字比我预期的少一个?_C_Strcat - Fatal编程技术网

C 为什么在这个实例中strlen()返回的数字比我预期的少一个?

C 为什么在这个实例中strlen()返回的数字比我预期的少一个?,c,strcat,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。我希望斯特伦9点回来。我想#或@一定是这里的罪魁祸首。但是,当我删

例如:

    {
        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
。它超出了有效边界,并且作为一个reuslt,您有

您需要确保连接的结果可以保存到目标内存中。换句话说,您需要确保
s1
足够大,可以容纳

      strcat(s1,"L#@");
实现这一点的基本方法是通过在编译时指定大小使目标足够大,比如

#define SIZE 16
....
char s1[SIZE]="ABCDEF";
然后,相应地使用它

在这里,我们只是将
s1
设置得足够大,以容纳串联的结果

也就是说,
strlen()
的返回类型是
size\u t
,因此您应该使用
%zu
打印结果

当你说

 strcat(s1,"L#@");
连接字符串(结果)太长,无法适应
s1
。它超出了有效边界,并且作为一个reuslt,您有

您需要确保连接的结果可以保存到目标内存中。换句话说,您需要确保
s1
足够大,可以容纳

      strcat(s1,"L#@");
实现这一点的基本方法是通过在编译时指定大小使目标足够大,比如

#define SIZE 16
....
char s1[SIZE]="ABCDEF";
然后,相应地使用它

在这里,我们只是将
s1
设置得足够大,以容纳串联的结果


也就是说,
strlen()
的返回类型是
size\u t
,因此您应该使用
%zu
打印结果

忽略这样一个事实,即您正在写入超过字符串结尾的内容

在strcpy(s1,s2)之后s1包含“ZWXYZ”


strcat(s1)之后,“L#@”)
s1包含长度为ogf 8的“ZWXYZL#@”,忽略写入超过字符串结尾的事实

在strcpy(s1,s2)之后s1包含“ZWXYZ”


strcat(s1,“L#@”)之后
s1包含长度为ogf 8的“ZWXYZL#@”,您在
s1
末尾写入。是UB。没有意义。你有未定义的行为定义
chars1[]=“ABCDEF”等于字符s1[7]={A',B',C',D',E',F','\0'}s1
的内容替换为长度为5的
s2
,然后在末尾追加3个字符。您的写入超过了
s1
的末尾。是UB。没有意义。你有未定义的行为定义
chars1[]=“ABCDEF”等于字符s1[7]={A',B',C',D',E',F','\0'}s1
的内容替换为长度为5的
s2
,然后在末尾附加3个字符。您好,谢谢您的回答。这是我期中练习的一个问题。我想我会在实际的期中考试中看到这些问题。我该怎么回答这个问题呢?因为正确答案(根据我的教授)是a=8和b=5;不是未定义的行为。@LtLame如果你的教授真的说他非常不称职(不仅不知道事情,而且知道错误的事情并教他们)。@LtLame如果你分配足够的内存,情况会是这样。@Art你不能这么说,可能教授没有看这个代码。嗨,谢谢你的回答。这是我期中练习的一个问题。我想我会在实际的期中考试中看到这些问题。我该怎么回答这个问题呢?因为正确答案(根据我的教授)是a=8和b=5;不是未定义的行为。@LtLame如果你的教授真的说他非常不称职(不仅不知道事情,而且知道错误的事情并教他们)。@LtLame如果你分配足够的内存,情况会是这样。@Art你不能这么说,可能教授没有看这段代码。