这涉及两个功能,两个功能如下:
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?/
老实说,我不知道这里有什么问题。我假设它将第一个字符串与分隔符连接起来,但随后它遇到了一些它无法处理并开始输出乱码的垃圾。
答案 0 :(得分:2)
函数catw实际上是你的问题。您将s
变量定义为数组。此变量以及与之关联的存储仅在函数运行时有效。
将s
复制到rs
时,您只需复制地址,而不是相关存储空间。函数结束后,s
和rs
都指向释放的内存,对它们的任何访问都将是未定义的行为。因为它们仍指向堆栈内存,所以不会出现分段错误,但是您正在读取已被其他内容替换的数据。