Почему getchar () не заставит меня нажать enter после scanf ()?

Я изучаю C, и я использую «getchar ()», чтобы остановить командные windows, чтобы я мог видеть упражнения, которые делают, но он просто не работает. heres образец:

#include  int main() { int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); switch (value) { case 1: printf("you selected the option 1."); break; case 2: printf("you selected the option 2."); break; case 3: printf("you selected the option 3."); break; case 4: printf("goodbye"); break; default: printf("thats not an option"); break; } getchar(); return 0; } 

это результат:

  1. Опция 1.
  2. вариант 2.
  3. вариант 3.
  4. Выход.

Сделайте выбор: 1

вы выбрали вариант 1.

Возвращенный процесс 0 (0x0) время выполнения: 3,453 с

Нажмите любую клавишу для продолжения.

Почему он не ждет ввода «getchar ()»?

Ваш scanf использовал только число, но не конечную новую строку. Помещение новой строки или пробела после% d приведет к противоположной проблеме, слишком зачитывая слишком далеко.

Вот почему людям не нравится scanf.

Я бы предложил прочитать фактическую строку (использовать fgets(3) ), а затем использовать sscanf() для сканирования строки.

Прежде всего, не используйте fflush () для очистки входного streamа; поведение не определено:

7.19.5.2.2 Если stream указывает на выходной stream или stream обновлений, в котором последняя операция не была введена, функция fflush заставляет любые неписаные данные для этого streamа доставляться в среду хоста, которая должна быть записана в файл; в противном случае поведение не определено.

Проблема заключается в том, что конечная новая строка не потребляется спецификатором преобразования «% d», поэтому сразу же получается getchar() . Нет никакого лучшего способа справиться с этим, но в целом подход состоит в том, чтобы прочитать всю строку как текст (используя либо fgets() либо scanf() с спецификатором размера «% s»), который будет потреблять новую строку, затем конвертировать в целевой тип данных с помощью sscanf() или strtol() или strtod() .

Может ли getchar получить возврат каретки, который вы вводите после 1?

Getchar () читает \ n с клавиатуры в scanf – см. Здесь для получения дополнительной информации

вы получаете возврат каретки, способ, которым я обойду его, определить символ и просто проверить его возврат каретки,

char ch; (до вашего getch () введите следующее) scanf("%c",&ch); getchar(); scanf("%c",&ch); getchar();

должен работать таким образом, а не самый эффективный способ сделать это, но работает для меня.

Как уже упоминалось, scanf оставляет \ n после чтения пользовательского ввода.

Soultion: добавить getchar () прямо после scanf.

Это компенсирует дефицит сканирования.

т.е.

 int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); getchar(); switch (value) 

Я думаю, что вы вводите ввод после ввода «1». Он будет принят getchar() Таким образом, вы можете решить проблему просто добавив дополнительный getchar() после первоначального (непосредственно перед return 0; ).

** Я проверил это, и он сработал.

 #include  #include void main() { int value; printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); scanf("%d", &value); switch (value) { case 1: printf("you selected the option 1."); break; case 2: printf("you selected the option 2."); break; case 3: printf("you selected the option 3."); break; case 4: printf("goodbye"); break; default: printf("thats not an option"); break; } getch(); } 

для того, чтобы ваша программа работала, вы должны «очистить» входной stream до вызова getchar () с вызовом fflush (stdin). Это означает, что при вводе на клавиатуре числа, а затем ключа возврата входной буфер получает оба символа, например «1» и «\ n», и ваш вызов scanf получает только «1», \ n ‘остается во входном буфере. Когда вы вызываете getchar, вы получаете «gettin», который остается «\ n». Промывка входа сбрасывает весь буфер.

Давайте будем гением компьютера.