scanf

问题:    

    说到scanf,为了让scanf从缓冲区读取输入流数据,最后都得一个回车。然而今天不小心发现一个有趣的现象。导致最后无论按几个回车,输入流数据都无法被scanf读取。

    程序入下:

#pragma warning(disable:4996) 
#include <stdio.h>
#include<stdlib.h>
void main()
{
    
    double x=0;
        scanf("%lf\n",&x);
    printf("输出x:%lf\n",x);
    fflush(stdin);
    system("pause");
}
输出入下,可以看出中间按了好多次回车,没有用,直到随便按了个4,再按回车才有输出。

分析:

    原因在于scanf的读取原理是匹配字符,但规则上是跳过 空格 回车  制表 空白字符的,从第一个非空白字符开始读取。所以上述程序scanf会读取一个数字,然后认为接下来的第一个回车为通知程序开始读取缓冲区,%lf匹配了12.3,同时程序丢弃第一个回车,由于scanf的匹配串还差一个回车,所以scanf等待一个回车字符~~~问题就出在由于回车为空白字符,所以scanf会跳过第一个之后4之前的所有回车,等待第一个出现的非空白字符和之后的回车,才会再一次读取缓冲区。是的这些回车符没有起到通知程序开始读取缓冲区的作用!!!

    而在输入4和之后的回车之后,程序以4之后的那个回车为信号,开始再一次依次读取缓冲区。此时缓冲区读取顺序从第二个输入的回车开始。然后第二个回车和匹配到了scanf中的\n匹配成功,程序继续执行,其他没有匹配的字符依然停在缓冲区。

结论:

    本文的问题主要是以下三点综合作用导致的奇怪问题。充分理解此问题,对理解scanf读取原理很有用。

        1.scanf的匹配规则

        2.回车的空白字符属性

        3.回车有通知scanf读取缓冲区的独特作用
--------------------- 
作者:ll_dream 
来源:CSDN 
原文:https://blog.csdn.net/ll_dream/article/details/80253189 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值