Очистка stdin после «Нажмите ENTER, чтобы продолжить»?

#c #io #console-application #stdin #flush

#c #io #консольное приложение #stdin #сброс

Вопрос:

Я пытаюсь позволить пользователю подтвердить свое действие нажатием клавиши ENTER — если нажата любая другая клавиша, указанное «действие» не выполняется.

Однако, вместо простого if((ch=getchar())=='n') {...} , я действительно хочу очистить stdin на случай, если пользователь введет что-то вроде hellon вместо того, чтобы позволить этому быть прочитанным в следующий раз, когда я буду вводить данные в свою программу.

Функция, которую я использую для очистки stdin , это :

 void eat()
{
    int eat; while ((eat = getchar()) != 'n' amp;amp; eat != EOF);
}
  

Однако эта стратегия оставляет меня с пользователем, вынужденным дважды нажимать ENTER, поскольку он «съедает» новую строку, которая должна заставить его отправлять входные данные в мою программу (в терминале).

Что может быть самым простым и элегантным решением?

ПРИМЕЧАНИЕ: я не могу использовать непереносимые решения, такие как настройка консоли на немедленную отправку каждого символа с помощью POSIX terminos.h .

Комментарии:

1. Другими словами: вы хотите прочитать строку. Если он пустой, это подтверждение, если нет, то нет. Итак … fgets ?

2. @dratenik это звучит блестяще — хотите опубликовать ответ?

3. Ну, тогда ладно.

Ответ №1:

Похоже, вы хотите прочитать строку, а затем проверить, пуста она или нет? Похоже, задание для fgets(..., stdin)

 char mystring [100];
fgets (mystring , 100 , stdin);
if (*mystring == 'n') {//confirmed}
  

Комментарии:

1.подождите… Я больше не могу eat() звонить без тех же проблем, что и при использовании последнего 'n' , который будет отмечать EOL, в результате чего пользователю придется дважды нажать ENTER…