课程设计心得_关于switch输入字母进入死循环问题

做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;
    }
}
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值