Проблема, с которой вы столкнулись, вызвана тем, что вы не добавляете нулевой терминатор в line2
(а в массиве также не хватает места для него), поэтому line2
не является нулевым символом в концестрока байтов.
Передача указателя на что-либо кроме строки байтов с нулем в конце на strcmp
вызывает неопределенное поведение
Самый простой способ исправитьКод предназначен для внесения следующих изменений:
/* Don't subtract 1 from `strlen`, otherwise you don't copy the entire string in your loop */
int length = strlen(line);
/* Unchanged */
int i = 0;
int j = length - 1;
/* increase size of array by 1 to have space for null-terminator */
char line2[length + 1];
/* Loop is unchanged */
while (i < length){
if (j >= 0){
line2[i] = line[j];
}
i++;
j--;
}
/* Add null-terminator to have a valid byte string */
line2[length] = '\0';
Обратите также внимание, что существуют более простые способы выполнить проверку палиндрома, но этот ответ сфокусирован только на том, почему ваш код сталкивается с ошибкой времени выполнения.
РЕДАКТИРОВАТЬ: Как указано в комментариях fgets
также хранит символ новой строки внутри массива.Чтобы проверка вашего палиндрома работала корректно, вам необходимо настроить код (например: удалить символ новой строки из line
перед созданием line2
и скопировать символы)