这涉及到两个函数,下面列出了两个函数:
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?/
老实说,我不知道问题出在哪里。我假设它将第一个字符串与分隔符连接起来,但随后它遇到了一些无法处理的废话并开始输出乱码。
最佳答案
函数 catw 实际上是你的问题。您正在将 s
变量定义为数组。该变量以及与其关联的存储仅在函数运行期间有效。
当您将 s
复制到 rs
时,您只需复制地址,而不是关联存储。一旦函数结束,s
和 rs
都指向已释放的内存,对它们的任何访问都将是未定义的行为。因为它们仍然指向堆栈内存,所以您不会遇到段错误,但您正在读取的数据已被其他内容替换。
关于c - 数组连接函数返回乱码。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41927078/