总线错误:10不知道为什么

时间:2014-04-09 14:53:26

标签: c strcat

这段代码应该连接2个字符串,但是我收到了总线错误:10。我已经研究过它,所以我给了t1更多的空间,但我还是得到了这个错误。你能帮我吗? 提前谢谢!

char *strCat (char s1[], char s2[])
{
    int i=0,j=0;

    while (s1[i++]);

    while (s2[j])
    {
        s1[j++] = s2[j++];
    }

    s1[j] = '\0';

    return s1;
}

int main()
{
    char t1[10] = "asd";
    char t2[] = "fgh";
    printf("%s", strCat(t1,t2));
}

1 个答案:

答案 0 :(得分:2)

这段代码存在一些问题。

while (s2[j])
{
    s1[j++] = s2[j++];
}

由于j++在同一行中执行了两次,因此您正在调用undefined behavior。如果我们将j++移动到它自己的行:

,这将消失
while (s2[j])
  {
    s1[j] = s2[j];
    j++;
  }

您的代码还有两个问题。首先,您使用一个计数器(i)到达s1的末尾,但在将s2追加到s1时不要使用它。我们来解决这个问题:

while (s2[j])
  {
    s1[i] = s2[j];
    i++;
    j++;
  }

\0追加到s1时,我们需要做同样的事情:

s1[j] = '\0';

变为

s1[i] = '\0';

其次是i的一个小错误。

while (s1[i++]);

如果您在心理上追踪这一点,i++将会比您想要的更多次评估,当循环结束时将i置于4。但是,此时s1asd中只有三个字符。 a =字符0,s =字符1,d =字符2.我们想要开始在s2之后写一个字符,所以我们要从字符 3 开始写字。调整循环以匹配,

while (s1[i++]);
i--;

为了清楚起见,您也可以这样做:

while (s1[i])
{
  i++;
}

现在,把它们放在一起:

#include <iostream>

char *strCat(char s1[], char s2[])
{
  int i = 0, j = 0;

  while (s1[i])
  {
    i++;
  }

  while (s2[j])
  {
    s1[i] = s2[j];
    i++;
    j++;
  }

  s1[i] = '\0';

  return s1;
}

int main()
{
  char t1[10] = "asd";
  char t2[] = "fgh";
  printf("%s", strCat(t1, t2));
}

这可以按预期工作。