fgets
прекращает чтение после ввода, когда видит новую строку (которая не используется, если в буфере недостаточно места). Таким образом, новая строка из первого ввода остается во входном потоке, который второй вызов fgets видит и прекращает чтение ввода.
Когда вы добавляете getc(stdin);
, он потребляет остаток символа новой строки, поэтому он работает.
Как отмечено в комментариях, вы выделяете только n
байт для a
, но пытаетесь читать до n + 1
байтов. Это неопределенное поведение. Поэтому вам нужно добавить «+ 1» к вызову mallo c (как вы делаете для распределения b
).
Другая проблема, о которой вам нужно знать, это fgets
будет также читать символ новой строки в a
и b
, если у них достаточно места (например, вы вводите просто "hi" и n
равно 10).
И еще одна проблема заключается в том, что если заданное значение меньше n
, вы oop все равно сравниваете n
символов. Это может быть неопределенным, так как остальные буферы неинициализированы.
Вы также можете break
из l oop сразу, когда есть несоответствие. Не нужно сравнивать остальные символы.