while循环中使用scanf函数

妈的,这scanf函数学了快10年了,怎么还会出现莫名其妙的问题?看下面的代码(VS2012环境下运行):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    char root_value = '\0';
    int i =1;
    while (i!=5)
    {
        printf("输入:");
        scanf("%c",&root_value);//用户输入节点
        i++;
    }
    
    printf("输入:%c\n",root_value);
}

本意是每次循环读取一个字符,结果在VS2012里面运行,运行结果莫名其妙:第一次循环输入字符a,然后回车,进行下一次输入,结果屏幕直接输出两个“输入:输入:“。原来scanf把回车也当作一个字符读入了。

原因是因为scanf()函数会把回车、空格、Tab或一些非法输入的字符当作此次输入的结束标志,它不会把这些字符输入到想要保存此次输入数据的变量中,而是把这些字符遗留在了输入缓冲区,那么,当下一次想要从标准输入中读取一个字符时,这个遗留的字符就正好充当了此次的输入字符。
显而易见,程序在输入abcdefg之后,输入了回车来结束此次输入,那么回车就遗留在了输入缓冲区,当需要给c输入字符时,它自动的充当了输入的字符,因此,程序没有给我们输入c的字符的机会。(通过输出abcdefg之后又两个空行(残留在输入缓冲区和输出的两个回车导致的)也可以验证)

C语言为了解决这种问题,为我们提供了一种很方便的清空输入缓冲区的方式—->>fflush()函数,它会把残留在输入缓冲区里的所有数据清空

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    char root_value = '\0';
    int i =1;
    while (i!=5)
    {
        printf("输入:");
        scanf("%c",&root_value);//用户输入节点
        fflush(stdin);
        i++;
    }
    
    printf("输入:%c\n",root_value);
}

转载于:https://www.cnblogs.com/VIPler/p/6906434.html

回答: 在while循环scanf函数默认是阻塞的,即会等待用户输入数据。当用户输入数据后,scanf函数才会返回并将数据赋值给指定的变量。所以在while循环,如果没有用户输入数据,scanf函数会一直阻塞,导致循环无法继续执行。为了避免这种情况,可以在scanf函数后面添加判断条件,比如使用scanf的返回值来判断是否成功读取到数据,或者使用scanf(……) != EOF来判断是否到达文件末尾。这样可以确保在没有输入数据时,循环能够正常结束。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [【C语言】EOF搭配while循环来控制scanf输入的次数](https://blog.csdn.net/weixin_59511824/article/details/131178927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [EOF的意义及用法(while(scanf("%d",&n) != EOF))](https://blog.csdn.net/henu1710252658/article/details/83040281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于while(cin>>x)和while(scanf(“%d,&x))的区别](https://blog.csdn.net/weixin_62636014/article/details/123075808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值