Почему 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 ()»?

    9 Solutions collect form web for “Почему getchar () не заставит меня нажать enter после scanf ()?”

    Ваш 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». Промывка входа сбрасывает весь буфер.

    Interesting Posts

    Бесконечная recursion с выпуском Jackson JSON и Hibernate JPA

    Как удалить последние файлы, открытые для каждого приложения в Ccleaner

    Синтаксис для создания двумерного массива

    Сокращение времени ожидания доступа к памяти в Windows (особенно для съемных носителей)?

    Как применить тип к экземпляру NSFetchRequest?

    Использовать шрифты cleartype в Google Chrome

    Как я могу полностью удалить Sogou Chinese IME из Windows?

    Как объединить несколько файлов в один?

    Аккумулятор ноутбука заряжается, но больше не заряжается

    Как исправить: обработчик «PageHandlerFactory-Integrated» имеет плохой модуль «ManagedPipelineHandler» в своем списке модhive

    Regex для строки с кавычками

    Невозможно проанализировать строку DateTime с маркером AM / PM

    Как остановить Windows 10 от автоматического перезапуска

    Thread.Sleep менее 1 миллисекунды

    Лучший уровень предупреждения компилятора для компиляторов C / C ++?

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