Как упоминает Ираклон в своем комментарии, наиболее вероятная причина в том, что у вас есть вызов scanf
перед вызовом gets
, а завершающий символ новой строки из предыдущего ввода расходуется на gets
до того, как у вас появится шанс чтобы ввести что-нибудь еще.
Вы никогда не должны использовать gets
в любом случае - он был удален из стандартной библиотеки в версии языка 2011 года. Его использование небезопасно, и создаст дыру в безопасности вашего кода. Вместо этого используйте fgets
. Его поведение немного отличается (он сохранит завершающий символ новой строки во входном буфере, если есть место, где gets
отбросил его), но гораздо безопаснее:
if ( fgets( engphr, sizeof engphr, stdin ) ) // assumes engphr is declared as an array, not a pointer
{
// process engphr
}
Сказав это, вы действительно не должны Смешайте вызовы к scanf
и fgets
, опять же, потому что scanf
оставит завершающие символы новой строки во входном потоке от предыдущих входов, а fgets
немедленно вернется после просмотра этой строки. Либо прочитайте все входные данные, используя fgets
, и используйте sscanf
, чтобы прочитать указанные c элементы из буфера ввода, либо прочитайте все входные данные с помощью scanf
.