zoukankan      html  css  js  c++  java
  • C语言缓冲区问题

    转自:https://www.cnblogs.com/bossren/p/6369330.html

    缓冲区:

    输入缓冲区

      键盘—》键盘缓冲区—》输入缓冲区—》程序(scanf函数)

      我们在键盘上输入的任何东西,会先进入输入缓冲区区域,然后程序从输入缓冲区里把数据一个一个读出来。

    输入缓冲区的管理方式:

      先进入的数字会被先读出来(输入缓冲区里把前面的数字读走了,才能读后面的数字)

    1. scanf就是从输入缓冲区里拿数字,如果输入缓冲区的内容和scanf指定的格式类型不一样,它就不动,不会把输入缓冲区里的任何内容转移走。
    2. 所以你用scanf读一个%d,输入缓冲区输入一个[a 10],用scanf读取一个整数的时候,它读出来的a发现不是一个整数,它又把这个a放回去了。下回再读,还是读的这个a。a始终堵在缓冲区内,后面的数据10读不到。
    3. 为了解决这个问题,我们在每次读取一个数据后,把输入缓冲区里的数据全清理掉,我不管里面有什么,我这次读完了过后也不管这次是读到还是没读到,反正我这次读完了过后把输入缓冲区全部清理掉,这样的话我保证你下一次读的时候是一个新的开始。
    4. 每次读完一个数据后,把输入缓冲区里的数据全部清理掉,保证下一次再读的时候一定是一个新的开始,这样就不会因为前一次的错误导致后一次出问题。【清理输入缓冲区的目的:前面的输入出错了,保证不会影响后面的输入】

      每次读完一个数据后清理输入缓冲区,保证前面的输入出错了,不会影响后面的输入

        scanf("%*[^ ]");

        scanf("%*c");

      输入缓冲区有这样的一个特点:只有当其中的数据读走的时候,才会清除这个数据。

      scanf(数据类型)和缓冲区中的数据类型不一致的时候,便无法读走数据,可能会导致死循环。

    解决上面问题的办法:

      scanf("%*[^ ]");//*忽略读到的内容,[^ ]任何非 的字符;将 之前的所有字符读走

      scanf("%*c");//从缓冲区读取一个字符忽略掉

      补充:scanf调用失败(主要原因:类型不匹配)返回垃圾值。

    char ch;

    //下面两行可以完全请空缓冲区中的一行内容

    scanf("%*[^ ]");//先将换行符之前的所有内容都清掉

    scanf("%c", &ch);//再将 从输入缓冲区读走

    scanf的运行原理

    1. scanf如果发现输入缓冲区中没有东西,就启动录入
    2. scanf发现输入缓冲区中有 ,那么他就会去输入缓冲区取值
    3. 如果发现是自己的菜就会取走放到自己盘子里
    4. 如果不是自己的菜,就会自己回去了

     

       

        

    //检查输入格式是否正确

    #include <stdio.h>

    int main() {

        int num=0;//初始化清零

        printf("请输入一个数字:");

        while (!scanf("%d",&num)) {

            scanf("%*[^ ]");

            scanf("%*c");

            printf("输入格式错误! 请输入一个数字:");

        }

        printf("输入正确!num=%d ",num);

        return 0;

    }

       

      每次使用scanf函数读数据后都需要清理输入缓冲区!

        

    输出缓冲区:

      程序(printf函数)->输出缓冲区->屏幕

      程序的输出可以到达屏幕的条件

      输出缓冲区内容显示在屏幕上的条件(至少满足一个):

    1. 遇到
    2. 程序结束(函数结束)
    3. 输出缓冲区满了
    4. 使用fflush(stdout)强制刷新(人工刷新)

    举例:

     

  • 相关阅读:
    理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
    TSQL查询进阶流程控制语句
    效率最高的Excel数据导入(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)
    SQL Service自定义数据类型
    理解SQL SERVER中的逻辑读,预读和物理读
    TSQL查询进阶深入理解子查询
    SQL查询入门(下篇)
    使用SQL进行递归查询
    利用 sys.sysprocesses 检查 Sql Server的阻塞和死锁
    灵活运用 SQL SERVER FOR XML PATH
  • 原文地址:https://www.cnblogs.com/coolYuan/p/14190248.html
Copyright © 2011-2022 走看看