использование неинициализированного значения, ошибка при использовании sprintf или strcat

Приведенный ниже фрагмент кода полностью работает в моей среде IDE. Но когда я отправляю это на codeforces, я получаю сообщение об ошибке, указывающее на строку sprintf.

Вероятно, решение выполняется с ошибкой 'использование неинициализированного значения'

Я использовал sprintf вместо strcat для объединения двух массивов, как это было предложено в ответе на stackoverflow. Но это дает мне ту же ошибку.

char a[101],b[101],c[201],d[300];
fgets(a,101,stdin);
fgets(b,101,stdin);
fgets(c,201,stdin);
// strcat(d,a);
sprintf(d, "%s%s",d,a);

person Siddharth Magadum    schedule 12.06.2020    source источник
comment
d используется без инициализации.   -  person user7860670    schedule 12.06.2020
comment
Вы не можете использовать одну и ту же строку в качестве места назначения и источника в sprintf()   -  person Barmar    schedule 12.06.2020


Ответы (3)


Вы можете использовать strcat(), только если вы уже инициализировали обе строки.

Поскольку вы еще ничего не поместили в d, вам не нужно присоединяться к нему. Просто скопируйте в него содержимое a с помощью strcpy().

strcpy(d, a);

Кроме того, даже если вы инициализировали d, вы не можете использовать

sprintf(d, "%s%s",d,a);

Недопустимо использовать ту же строку в качестве назначения sprintf(), если она также является одной из исходных строк.

person Barmar    schedule 12.06.2020

Вы записываете неинициализированную переменную d в местоположение d. В этом нет никакого смысла. Возможно, вы хотели сделать sprintf(d,"%s",a);?

В этом случае вам не нужно инициализировать d, но если вы используете strcat, вы должны инициализировать первый элемент в d значением \0.

person Lundin    schedule 12.06.2020

Вы не инициализировали d, поэтому он, вероятно, не имеет символа '\ 0'.

strcat ищет первый 0 в массиве, а затем начинает объединение оттуда. Если он не может найти 0, он читает за пределами конца массива.

char d[300] = {0};

исправит это как для strcat, так и для sprintf

person Serve Laurijssen    schedule 12.06.2020
comment
Но независимо от инициализации sprintf(d, "%s%s",d,a); просто не имеет смысла. - person Lundin; 12.06.2020