Разработка меню, повторное сообщение

#c #algorithm #menu

#c #алгоритм #меню

Вопрос:

Я работаю над консольным приложением, в котором должно быть небольшое меню для выбора из разных вариантов. Мне пришли в голову две идеи, в одной из которых я использовал int в качестве переменной выбора, и это приводит меня к бесконечному циклу всякий раз, когда я ввожу символ, отличный от числового. Другой, хотя мне кажется более понятным, но я не могу понять, почему я получаю сообщение «Выберите опцию, а не цифровую опцию», даже если я выбираю допустимый теоретически вариант, пожалуйста, дайте мне знать, в чем проблема с моим кодом. Я прилагаю второй пример, о котором я упоминал.

 #include <stdio.h>
#include <ctype.h>

void F1()
{
    printf("Function 1n");
}
void F2()
{
    printf("Function 2n");
}
void F3()
{
    printf("Function 3n");
}

int main()
{
    char c;
    printf("MAIN MENUn"
         "1. Function 1n"
         "2. Function 2n"
         "3. Function 3n"
         "4. Exitn");
    while(1)
    {
        printf("Choose an option ");
        scanf("%c", amp;c);
        if(isdigit(c) == 0) printf("Not a digit");
        else 
        {
            if(c == '1') F1();
            else if(c == '2') F2();
            else if(c == '3') F3();
            else if(c == '4') break;
            else printf("Wrong option");
        }
    }   
    return 0;
}
 

Ответ №1:

Вам необходимо очистить входной буфер, чтобы очистить n символ, оставшийся после предыдущего вызова scanf . Поместите пробел перед %c scanf

  scanf(" %c", amp;c);  
 

или, в общем, вы очищаете входной буфер, помещая этот фрагмент после каждого вызова scanf :

 int c
while((c = getchar()) != 'n' amp;amp; c != EOF);
 

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

1. Нет необходимости проверять наличие ‘ n’, что может привести к сбою в определенных ОС. (DOS, Windows) Правильный метод — проверять только значение EOF.

2. @user3629249; Это никогда не подводило с тех пор, как я программировал.

Ответ №2:

Первый вызов scanf() будет преобразован в введенный вами символ, а второй будет считывать символ новой строки.

Вам нужно закончить чтение строки после вашего вызова scanf():

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