Ждать нажатия Enter в C внутри цикла while?

Я пишу программу на C, и мне нужно дождаться, пока пользователь нажмет любую клавишу, чтобы продолжить. Когда я использую getchar();, он ожидает нажатия клавиши Enter. Но когда я использую его внутри цикла while, он не работает. Как я могу заставить свой код ждать нажатия любой клавиши, чтобы продолжить цикл?

Вот мой пример кода. Я использую GNU/Linux.

#include <stdio.h>
#include<stdlib.h>
int main()
{
    int choice;
    while(1) {
        printf("1.Create Train\n");
        printf("2.Display Train\n");
        printf("3.Insert Bogie into Train\n");
        printf("4.Remove Bogie from Train\n");
        printf("5.Search Bogie into Train\n");
        printf("6.Reverse the Train\n");
        printf("7.Exit");
        printf("\nEnter Your choice : ");
        fflush(stdin);
        scanf("%d",&choice);

        switch(choice)
        {
            case 1:
                printf("Train Created.");
                break;
            case 2:
                printf("Train Displayed.");
                break;
            case 7:
                exit(1);
            default:
                printf("Invalid Input!!!\n");
        }

        printf("Press [Enter] key to continue.\n");
        getchar();
    }

    return 0;
}

person H.R. Shadhin    schedule 07.02.2015    source источник
comment
Вместо этого используйте _getch.   -  person barak manos    schedule 07.02.2015
comment
я использую linux.не работает. неопределенная ссылка на _getchar   -  person H.R. Shadhin    schedule 07.02.2015
comment
Я сказал _getch, а не _getchar!!!   -  person barak manos    schedule 07.02.2015
comment
такая же ошибка. неопределенная ссылка на _getch   -  person H.R. Shadhin    schedule 07.02.2015
comment
Я думаю, он находится в conio.h (кстати, простой поиск в Интернете тоже приведет вас туда).   -  person barak manos    schedule 07.02.2015
comment
Я думаю, вы должны использовать два getchar() вместо одного. ваш предыдущий \n читается в getchar(), так что вам нужно два из них.   -  person Parham Alvani    schedule 07.02.2015
comment
@barakmanos Я думаю, что в Linux нет conio.h. это библиотека виндовс.   -  person Parham Alvani    schedule 07.02.2015
comment
@barakmanos я упоминаю об этом. я использую линукс, а не винду. conio.h доступно только в Windows. @ParhamAlvani это работа. но мой вопрос fflush(stdin) почему бы не работать до getchar() ?   -  person H.R. Shadhin    schedule 07.02.2015
comment
@TuxBot Я думаю, вы должны поставить fflush(stdin) перед getchar() и после scanf()   -  person Parham Alvani    schedule 07.02.2015
comment
Просто добавьте еще один getchar() после scanf или getchar() и удалите fflush.   -  person Spikatrix    schedule 07.02.2015
comment
Вы можете попробовать использовать system("read -n1 -r ")   -  person Spikatrix    schedule 07.02.2015


Ответы (3)


Если этот код (с дополнительным сбросом)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int choice;
    while(1){
        printf("1.Create Train\n");
        // print other options
        printf("\nEnter Your choice : ");
        fflush(stdin);
        scanf("%d", &choice);
        // do something with choice
        // ...
        // ask for ENTER key
        printf("Press [Enter] key to continue.\n");
        fflush(stdin); // option ONE to clean stdin
        getchar(); // wait for ENTER
    }
    return 0;
}

Не работает должным образом.

Попробуйте этот код (с циклом):

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int choice;
    while(1){
        printf("1.Create Train\n");
        // print other options
        printf("\nEnter Your choice : ");
        fflush(stdin);
        scanf("%d", &choice);
        // do something with choice
        // ...
        // ask for ENTER key
        printf("Press [Enter] key to continue.\n");
        while(getchar()!='\n'); // option TWO to clean stdin
        getchar(); // wait for ENTER
    }
    return 0;
}
person VolAnd    schedule 08.02.2015
comment
fflush(stdin) — это Undefined Behavior, и его никогда нельзя использовать! - person alx; 03.04.2019
comment
@CacahueteFrito согласен (это было в исходном коде), так что вариант 2 предпочтительнее - while(getchar()!='\n'); - person VolAnd; 03.04.2019
comment
Но у него все еще есть fflush(stdin) посередине. Вы не забыли удалить его? - person alx; 03.04.2019
comment
Я бы поставил два последовательных while (getchar() != '\n'); в конце и удалил обычный getchar();. Затем вы можете удалить этот fflush(stdin) в середине. - person alx; 03.04.2019

Ваш ответ, почему fflush(stdin) не будет работать, вы можете найти здесь:

Как очистить входной буфер в C?

http://c-faq.com/stdio/stdinflush.html

Надеюсь это поможет.

person Deepesh    schedule 07.02.2015

getchar() прочитает клавишу ввода, нажатую вами после ввода вашего выбора. В этом случае Enter ключ ASCII 13 считывается getchar()

Поэтому вам нужно очистить входной буфер или вы можете использовать другие альтернативы.

Вариант 1: используйте getchar() дважды

{
    getchar(); // This will store the enter key
    getchar(); //This will get the character you press..hence wait for the key press

}
person Nitin Pandey    schedule 07.02.2015
comment
Двойной getchar() не всегда мог работать. Например. если пользователь вводит строку, например 1abc, и нажимает Enter (когда запрашивается номер). - person VolAnd; 07.02.2015