scanf读取规则理解&回车无法结束 您所在的位置:网站首页 c语言中输入数据后怎么运行 scanf读取规则理解&回车无法结束

scanf读取规则理解&回车无法结束

2024-07-16 16:03| 来源: 网络整理| 查看: 265

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

    程序入下:

#pragma warning(disable:4996) #include #include 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读取缓冲区的独特作用

    



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有