Символы мусора C 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;
}

person vimalloc    schedule 22.04.2011    source источник
comment
Что такое dir_length и file_length?   -  person taskinoor    schedule 22.04.2011
comment
printf(get_string_1()); лучше, чем printf("%s", get_string_1());, если в строке есть процентные символы.   -  person    schedule 22.04.2011
comment
Кстати: sizeof(char) определяется как 1 по стандарту C, поэтому вы можете пропустить это.   -  person ChrisWue    schedule 22.04.2011
comment
@taskinoor - Извините, это была часть фактического кода, который я пропустил при преобразовании при перемещении его в пример кода.   -  person vimalloc    schedule 22.04.2011
comment
@Мастер катастроф Спасибо. @ChrisWue Также спасибо. :П   -  person vimalloc    schedule 22.04.2011
comment
Покажите код для get_string_1() и get_string_2(), пожалуйста.   -  person Karl Knechtel    schedule 22.04.2011
comment
@kari Это много-много строк кода, ни одну из которых я не написал.   -  person vimalloc    schedule 22.04.2011


Ответы (3)


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

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

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

person freespace    schedule 22.04.2011
comment
Спасатель жизни! Спасибо :) - person IcyBlueRose; 22.08.2013

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

/* Combine the strings */
strcpy(*results, get_string_1());
strcat(*results, get_string_2());
person 0xC0000022L    schedule 22.04.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».

person BiGYaN    schedule 22.04.2011