室友说一个小学弟写了一个扫雷程序,拿来给我看,尼玛,300多行代码都写在一个main函数里,我真的是#@#@FUCK,忍不了,想了一想,扫雷无非就那么几个功能,写个无页面的也挺容易的吧,撸起袖子就是干,其实对于一个小新手来说,写个扫雷还是很费脑细胞的,毕竟也没有什么参考价值的代码,尤其是扫雷中有一个很神奇的功能,就是你运气好的话,点一个位置,没准半个屏幕都被点开了,玩的时候的确感觉很爽,自己做起来真的有种#@#@的感觉
这是我最初的写的代码,当时的想法就是输入数字选择难度,如果输入的数字超出范围那么就提示用户重新输入数字:
while (num!=1&&num!=2&&num!=3) {
printf("请选择难度 1.初级 2.中级 3.高级\n");
scanf("%d",&num);
}//while
测试时无论输入多少,总是能很正确的运行,想也没多想就继续敲代码,一气呵成一晚上把代码敲的七七八八,每个小部分都进行过测试,也没什么问题,心想可算能休息休息,睡个觉了吧
但是似乎事情发展的太顺利,总是会给你搞点事情
这次程序在毫无征兆的情况下,死循环了···
printf("请选择难度 1.初级 2.中级 3.高级\n");
printf("请选择难度 1.初级 2.中级 3.高级\n");
printf("请选择难度 1.初级 2.中级 3.高级\n");
printf("请选择难度 1.初级 2.中级 3.高级\n");
printf("请选择难度 1.初级 2.中级 3.高级\n");
···
···
满屏幕的printf("请选择难度 1.初级 2.中级 3.高级\n"); MD,裤子都脱了,你给我看这个?(确实裤子脱了准备上床睡觉了)
又检查了几遍代码,发现没什么问题,看控制台发现,原来自己一不小心输入了非法字符,输了一个字母
那么问题来了,为什么输入了一个非法字符之后,每次循环都直接跳过我写的scanf("%d",&num);直接输出了呢?
为了解决这个问题,我默默的打开了Safari,在度娘上搜索关键字(原谅我不会google),发现相关问题还是挺多了,大体的意思就是说scanf有缓存区,当输入非法字符,会存放在scanf的缓存区,下次调用scanf函数时,会直接从缓存区读取非法字符,所以就会造成死循环。
解决方案就是,用一个变量来取出缓存区的全部数据,这样下次调用scanf函数时,就会从控制台接收,问题也就解决了!
while (num!=1&&num!=2&&num!=3) {
printf("请选择难度 1.初级 2.中级 3.高级\n");
scanf("%d",&num);
char c;
do{scanf("%c",&c);}while(c !='\n');
}//while