做C语言课程设计时,采用了大量的switch,在后期找bug时,当输入字符类型时,如a,*,+之类的,程序进入了死循环,但又不想换成其他的(主要是懒,不想大量改动)
void menu_windows()
{
int n;
system("cls");
fflush(stdin);
printf("\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("***********************[图书管理系统]***********************\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\n [1.管理员入口] \n");
printf("\n [2.读者入口] \n");
printf("\n [3.退出系统] \n\n");
printf("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\n\t[请选择]\t·");
scanf("%d",&n);
switch(n)
{
case 1: login_windows(); break;//管理员登录窗口
case 2: reader_loginwindows(); break;//读者登录窗口
case 3: exit(0); break;//退出系统
default: printf("\t\t输入有误!\n");
Sleep(1000);
menu_windows();
break;
}
}
所以上网查了一下,scanf函数是从缓冲区接受数值,而当我们输入字母或其他时,字符就一直留在缓冲区,再次循环,scanf再从缓冲区获取时还是字母,就相当跳过了scanf这一句,从而造成死循环。
经过测试后发现,只要把接受输入的变量定义在while循环里面,并给该变量赋值,在scanf之前清空缓冲区,这样程序就可以正常运行了。
即加入fflush(stdin); //清理缓冲区
void menu_windows()
{
int n;
system("cls");
fflush(stdin);//清理缓冲区
fflush(stdin);
printf("\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("***********************[图书管理系统]***********************\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\n [1.管理员入口] \n");
printf("\n [2.读者入口] \n");
printf("\n [3.退出系统] \n\n");
printf("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n");
printf("\n\t[请选择]\t·");
scanf("%d",&n);
switch(n)
{
case 1: login_windows(); break;//管理员登录窗口
case 2: reader_loginwindows(); break;//读者登录窗口
case 3: exit(0); break;//退出系统
default: printf("\t\t输入有误!\n");
Sleep(1000);
menu_windows();
break;
}
}