数组连接函数正在返回乱码。

时间:2017-01-29 23:19:32

标签: c arrays pointers

这涉及两个功能,两个功能如下:

char *catw(char *s1, char sep, char *s2) 
{
  char s[strlen(s1) + strlen(s2) + 1];
  for(int i = 0; i < strlen(s1); i++) {
    s[i] = s1[i]; 
  }
  s[strlen(s1)] = sep;
  for(int j = 1; j <= strlen(s2); j++) {
    s[j + strlen(s1)] = s2[j]; 
  }
  char *rs = s;
  return rs;
}

上面的函数工作正常,需要两个字符串并使用它们之间的字符将它们连接在一起。

char *catw_arr(char *ss[], char sep)
{
  char *ar = ss[0];
  for(int i = 1; i < strlen(ss); i++)
  {
    ar = catw(ar, sep, ss[i]);
    printf("%s\n", ar);

  }
  return ar;
}

然而,这个功能就是问题所在。它应该采用一个字符串数组,一个int是数组的长度,一个分隔符,并将所有字符串连接在一起。 printf在那里,因为我想测试发生了什么。

这是我正在使用的主要功能:

int main()
{
  char *abc[3] = {"a", "b", "c"};
  printf("%s\n", catw_arr(abc, 3, '/'));
  return 0;
}

这就是它的结果:

a/
?ĶS?/
?ĶS?/

老实说,我不知道这里有什么问题。我假设它将第一个字符串与分隔符连接起来,但随后它遇到了一些它无法处理并开始输出乱码的垃圾。

1 个答案:

答案 0 :(得分:2)

函数catw实际上是你的问题。您将s变量定义为数组。此变量以及与之关联的存储仅在函数运行时有效。

s复制到rs时,您只需复制地址,而不是相关存储空间。函数结束后,srs都指向释放的内存,对它们的任何访问都将是未定义的行为。因为它们仍指向堆栈内存,所以不会出现分段错误,但是您正在读取已被其他内容替换的数据。