В чистом стандарте C то, что вы хотите, вероятно, невозможно (и, конечно, плохо определено) и неясно.Стандарт C11 n1570 не знает о терминалах или клавиатуре (то есть о клавише enter ), но только о стандартных потоках .См. Также этот ответ на вопрос, близкий к вашему.
На практике, если вы работаете в какой-либо системе POSIX (которая, я полагаю, вы используете), терминал имеет строку Дисциплина управляется ядром.Однако стандартный ввод может не быть терминалом (с перенаправлениями или конвейерами ), и вы можете проверить, является ли он одним из них, используя isatty (3) как isatty(STDIN_FILENO)
...
Я рекомендую использовать некоторые библиотеки, такие как readline или ncurses , если это так.
Кстати, ваше использование select
имя сбивает с толку (так как select (2) был старым системным вызовом, сегодня заменен poll (2) ).
Если вы ограничены чистымC стандартными функциями, внимательно прочитайте документацию scanf и используйте счетчик возвращаемых значений.Вы, конечно, не можете (переносимо) поместить символ новой строки (или любой другой символ) в некоторый поток ввода, такой как stdin
.Но внимательно прочитайте о ungetc .
Я рекомендую скомпилировать все предупреждения и информацию об отладке (т. Е. gcc -Wall -Wextra -g
с GCC ) и научиться использоватьgdb
отладчик , чтобы понять поведение вашей программы.