C strcat垃圾字符

时间:2011-04-22 04:43:40

标签: c cstring strcat

我在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;
}

3 个答案:

答案 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'字符。