C strcat мусорные символы - PullRequest
       27

C strcat мусорные символы

2 голосов
/ 22 апреля 2011

У меня есть функция в 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 ]

10 голосов
/ 22 апреля 2011

strcat необходимо найти нулевой терминатор в месте назначения. Ваш *result указывает на неинициализированную память, которая содержит нулевой терминатор 5 символов.

Добавление *result[0]='\0'; непосредственно перед объединением строк должно исправить это.

Кроме того, вы не выделяете достаточно места для нулевого терминатора в *result.

5 голосов
/ 22 апреля 2011

Почему вы strcat первая строка? Просто скопируйте это. В противном случае он будет добавляться к любому мусору в неинициализированной памяти ...

/* Combine the strings */
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
2 голосов
/ 22 апреля 2011

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'.

...