我在C中有一个函数,我试图从两个不同的位置获取字符串(未知的大小,可能是安静的大)并将它们组合成一个字符串并返回它们。如果我只打印两个字符串然后我得到正确的结果,但是当我尝试使用strcat组合字符串时,我最终得到5个垃圾字符,然后是组合字符串的结果。
任何人都对我做错了什么有一些建议?以下是一些示例代码,用于演示我正在做的事情:
static int get_information(char** results)
{
size_t s1_length;
size_t s2_length;
/* DEBUGGING - Prints the correct string */
printf(get_string_1());
printf(get_string_2());
printf("\n");
/* Allocate memory for new string */
s1_length = strlen(get_string_1());
s2_length = strlen(get_string_2());
*results = malloc(sizeof(char) * (dir_length + file_length));
if(results == NULL)
return -1;
/* Combine the strings */
strcat(*results, get_string_1());
strcat(*results, get_string_2());
/* DEBUGGING - prints 5 garbage characters then the correct string */
printf(*results);
printf("\n");
return 0;
}
答案 0 :(得分:10)
strcat
需要在目标中找到空终止符。你的*result
指向未初始化的内存,恰好有5个字符的空终结符。
在组合字符串之前添加*result[0]='\0';
应修复它。
此外,您没有为*result
中的空终止符分配足够的空间。
答案 1 :(得分:5)
为什么你strcat
第一个字符串?只需复制它。否则它将附加到未初始化的内存中的任何垃圾......
/* Combine the strings */
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
答案 2 :(得分:2)
strcat()假定目标是有效字符串,因此通过添加
来实现*results[0] = '\0';
在你做strcat()之前
或者尝试这样做:
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
最后,这一行究竟发生了什么:
*results = malloc(sizeof(char) * (dir_length + file_length));
确保为结果分配足够的空间。理想情况下应该是:
*results = malloc(sizeof(char) * (s1_length+s2_length+1));
用于分配足够的空间作为s1和s2,然后是终止的'\ 0'字符。