【原创】由scanf()接收整数引起的死循环原因分析以及解决方案

blogdaren 2020-11-30 抢沙发 369人次

问题背景:

直接上代码:

#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 )原创,转载请保留文章出处。

本文链接:【原创】由scanf()接收整数引起的死循环原因分析以及解决方案

发表评论:

您的昵称:
电子邮件:
个人主页:

Free Web Hosting