【问题标题】:What are the two bugs in this C code?此 C 代码中的两个错误是什么?
【发布时间】:2014-02-11 04:29:08
【问题描述】:
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;
}

据说这段代码有两个bug..找出它们并解释为什么是bug并修改代码以更正它们...

我发现的错误是你不能返回数组,而且 s2 甚至没有被修改为首先返回......

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

谢谢!

【问题讨论】:

  • s1[k+s1len+1] 呢?
  • 问题你问的真正问题是什么??
  • 不能返回本地数组,但s2 不是本地数组。它是指向参数数组的指针。
  • 如果 strlen s2 > strlen s1, bad access.also this part s1[k+s1len+1]
  • 你怎么知道s1有足够的内存来追加s2?

标签: c debugging output


【解决方案1】:
  1. s1[k+s1len+1] 应该是s1[k+s1len]。否则,您将 s1 的尾随 null 留在附加字符串的中间。

  2. 您需要在追加s2的所有字符后追加一个空终止符。您可以通过将循环结束条件更改为 k &lt;= 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

【讨论】:

  • Annnnnnndd,成功了! +1 是如何产生如此大的影响的?老实说,我不明白这一点。如果附加或不附加空字符,条件如何变化?无论如何,它不这样做吗?
  • 返回 return s2; 而不是 s1 似乎很奇怪。
  • 是的,对不起,我实际上输入错误,然后复制错误。应该返回 s1。
  • 我在答案中添加了更多解释,说明为什么被 1 关闭会导致这个问题。
【解决方案2】:

问题是你需要知道 printf 是如何工作的。如果 printf 遇到空字符,它将停止写入标准输出,因此空字符之后的任何内容都不会显示在您的输出中,您可以通过将字符串中的任何字符更改为空字符然后检查其输出来测试这一点,仅此而已将在空字符之后打印。

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多