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

时间:2014-02-11 04:29:08

标签: c debugging output

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甚至没有被修改为首先被返回....

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

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

  3. 查看两个字符串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

答案 1 :(得分:0)

你需要知道printf是如何工作的。如果printf遇到空字符,它会停止写入stdout,所以在null字符后面的任何内容都不会显示在你的输出中,你可以通过将字符串中的任何字符更改为null字符然后检查其输出来测试它,没有别的将在空字符后打印。