3

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

3 回答 3

11

strcat需要在目标中找到空终止符。您*result指向未初始化的内存,其中恰好有一个空终止符 5 个字符。

*result[0]='\0';在组合字符串之前添加应该可以修复它。

此外,您没有为*result.

于 2011-04-22T04:46:41.743 回答
6

为什么你strcat是第一个字符串?简单地复制它。否则它将附加到未初始化内存中的任何垃圾...

/* Combine the strings */
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
于 2011-04-22T04:46:27.060 回答
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' 字符。

于 2011-04-22T04:57:50.557 回答