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读取缓冲区的独特作用

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章