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

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

#include <stdio.h>

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.
  • вариант 2.
  • вариант 3.
  • Выход.

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

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

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

Нажмите любую клавишу, чтобы продолжить.

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

Ответы

Ответ 1

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

Вот почему люди не любят scanf.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Это компенсирует дефицит 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) 

Ответ 8

#include <stdio.h> 
#include<conio.h>
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(); 
} 

Ответ 9

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