对于练习,我正在编写一个充当主菜单的程序。我希望用户在选项中进行选择。当用户输入一个整数时它工作正常,但是当输入一个字符时它会打印这个
无限而不只是打印“无效......”然后要求另一个输入。
#include <stdio.h>
#include <conio.h>
int main()
{
int menu_choice, User_Num, MENU, count;
MENU=1;
do
{
printf(" *---------------------------------------*\n");
printf(" | |\n");
printf(" | 1. Individual 2. Group 3.Exit |\n");
printf(" | |\n");
printf(" *---------------------------------------*\n\n");
printf(" -----------------------------------------------------------------\n");
printf("| Type '1' if you want to enter as an individual |\n");
printf("| Type '2' if you want to know enter as a group |\n");
printf("| Type '3' if you want to to stop the program |\n");
printf(" -----------------------------------------------------------------\n");
printf("What is your choice?");
scanf(" %d", &menu_choice);
if (menu_choice==1)
{
User_Num=1;
printf("Accepted\n");
}
else if (menu_choice==2)
{
do
{
printf("How many users?: ");
scanf(" %d", &User_Num);
if (User_Num<2)
printf("Invalid Input. Try Again \n");
} while (User_Num<2);
printf("Accepted\n");
}
else if (menu_choice==3)
{
printf("Good Bye and Thank You");
MENU=0;
}
else
{
printf("Invalid Input. Try Again \n");
}
} while (MENU);
getch();
}
答案 0 :(得分:2)
当scanf
看到无法根据格式解析的输入时,它只是将输入留在缓冲区中,它不会将其删除。因此,如果您尝试在循环中使用scanf
,则下一次迭代scanf
将看到上次无法解析的完全相同的输入,依此类推。
因此,我建议您使用fgets
将整行读入缓冲区,并使用sscanf
来解析自己的缓冲区。 和您需要检查sscanf
返回的内容,以了解它是否设法解析了任何内容。