【原创】由scanf()接收整数引起的死循环原因分析以及解决方案
问题背景:
直接上代码:
#include <stdio.h> int main() { int number, result; do{ printf("请输入一个整数:"); result = scanf("%d", &number); printf("你输入的整数是:%d\n", number); }while(1); return 0; }运行后,我们随意输入一个或多个非整型的其他任意字符,你会发现程序不但会不等待你再次输入,而且会陷入死循环不断的打印如下内容:
请输入你的考试成绩:你的考试成绩是:0
问题原因:
程序的意图很明显,希望用户输入一个整型数据,但是用户可能不按套路出牌(所以不要相信一切外来数据,统统要检验对不对?)输入了其他的任意字符,然而scanf("%d")遇到非整型字符时会跳过读取这些字符,换句话就是这些字符会继续保留在输入缓冲区(因为只接收数字啊),待到下次遇到scanf("%d")时,发现缓冲区依然是原来的这些非法字符,继续跳过......,如此就陷入了死循环(只有当输入缓冲区没有字符了才会重新等待你去输入)
解决方案:
知道了问题的原因,问题就好解决了,方案就是:只要我们把缓冲区的非法字符清除掉问题就可以迎刃而解。
解决代码-1:
if(result != 1) scanf("%*[^\n]");解决代码-2:
if(result != 1) while((ch = getchar()) != '\n'){};
版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。