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甚至没有被修改为首先被返回....
我错了吗?我不知道真正的错误是什么。
谢谢!
答案 0 :(得分:4)
s1[k+s1len+1]
应为s1[k+s1len]
。否则,将s1
的尾随空值留在附加字符串的中间。
在追加s2
的所有字符后,您需要附加一个空终结符。您可以通过将循环结束条件更改为k <= s2len
来自动实现此目的。
查看两个字符串abc
和defg
:
s1 = abc\0
0123
s2 = defg\0
01234
s1len = 3
s2len = 4
您想要的结果是:
s1 = abcdefg\0
01234567
当k = 0
,k+s1len+1 = 4
时,您的代码将s2
的第一个字符放在此处:
abc\0d
0123 4
所以null
字节留在原地。当循环完成时,整个结果是:
abc\0defg
中间有null
,但最后没有null
,因为您复制的最后一个字符是k = 3
。
答案 1 :(得分:0)
你需要知道printf是如何工作的。如果printf遇到空字符,它会停止写入stdout,所以在null字符后面的任何内容都不会显示在你的输出中,你可以通过将字符串中的任何字符更改为null字符然后检查其输出来测试它,没有别的将在空字符后打印。