#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) {}