繁体   English   中英

此C代码中的两个错误是什么?

[英]What are the two bugs in this C code?

char * append(char s1[], char s2[]) {

int s1len = strlen(s1);
int s2len = strlen(s2);
int k;
    for(k = 0; k<s2len; k++) {
        s1[k+s1len+1] = s2[k];
    }
return s1;
}

据说此代码中有两个错误。.识别它们并解释为什么它们是错误,然后修改代码以更正它们。

我发现的错误是您无法返回数组,而s2甚至没有被修改为首先返回。

我错了吗? 我不知道真正的错误是什么。

谢谢!

  1. s1[k+s1len+1]应该是s1[k+s1len] 否则,将s1的尾随null留在附加字符串的中间。

  2. 在附加s2所有字符后,需要附加一个空终止符。 您可以通过将循环结束条件更改为k <= s2len来自动实现。

查看两个字符串abcdefg

s1 = abc\0
     0123
s2 = defg\0
     01234
s1len = 3
s2len = 4

您想要的结果是:

s1 = abcdefg\0
     01234567

k = 0k+s1len+1 = 4 ,因此您的代码将s2的第一个字符放在此处:

abc\0d
0123 4

因此, null字节保留在原处。 循环完成后,整个结果为:

abc\0defg

中间有一个null ,但结尾没有null ,因为您复制的最后一个字符是k = 3

问题是您需要知道printf的工作方式。 如果printf遇到空字符,它将停止写入stdout,因此在输出空字符后将不会显示任何内容,您可以通过将字符串中的任何字符更改为空字符然后检查其输出来进行测试将在空字符后打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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