黑马程序员技术交流社区

标题: scanf的缓冲区谁能帮我讲通俗点 [打印本页]

作者: 叫我超哥    时间: 2016-3-15 23:59
标题: scanf的缓冲区谁能帮我讲通俗点

    char ch;
    scanf("%c",&ch);
    while (ch!='\n') {
        count++;
        scanf("%c",&ch);
    }
   
    printf("count = %d\n",count);
作者: 何必ˇㄨ那么假    时间: 2016-3-16 00:44
1. 在执行scanf函数的时候,会让用户输入1个数据.
     数据输入完毕之后,并不是将这个数据直接赋值给变量.
     而是先将数据存储在缓冲区 输入的任何数据都会存储在缓冲区中.

  2. 在执行scanf函数的时候.会先检查缓冲区中是否有数据.
     如果缓冲区中没有数据.那么就会让用户从键盘输入.
     如果缓冲区中有数据. 直接从缓冲区中将数据拿出来. 不会让用户输入数据.


  3. 当从缓冲区中拿数据的时候,如果要拿的数据的类型是整型或者实型.
     如果拿到的是空格 回车 Tab键 就会被自动忽略.继续往下拿.

     如果要拿的数据的类型是字符型.不会忽略任何数据.
     所以.当我们数字和字符混合输入的时候.字符的接收就有可能会出问题.


     解决方案: 在输入字符之前,将缓冲区中的数据全部清空.

     rewind(stdin);

作者: 菜逼    时间: 2016-3-16 00:50
一个水果(char)篮,里面有香蕉(int),苹果(float),葡萄(double)等等

叫你拿香蕉,你就只会拿香蕉
叫你拿苹果,你就只会拿苹果,
叫你拿水果呢.

系统会把缓冲区所有的内容都识别成char类型

你自己看看ascii表就懂了
作者: 我是王觉瘦    时间: 2016-3-16 01:44
简单说缓冲区就是一个池子.把输入的文件汇总到这个池子里面.然后计算机再从池子里读取.首先count没有声明和初始化.其次程序的目的是检测又没有遇到换行(\n).当你第一次输入一个字符('a'),并以回车结束后.进入while的条件判断('a' != '\n'成立),进入循环count自增.然后要求再次输入.但是这时池子里面还有你上次剩下的回车,计算机就会直接读取这个回车.再次回到循环条件判断时条件不成立.巴拉巴拉
作者: 简单的爱    时间: 2016-3-16 10:04
现在看了大家的解释,感觉更清晰了
作者: 叫我超哥    时间: 2016-3-16 17:59
何必ˇㄨ那么假 发表于 2016-3-16 00:44
1. 在执行scanf函数的时候,会让用户输入1个数据.
     数据输入完毕之后,并不是将这个数据直接赋值给变量.
...

非常感谢
作者: 叫我超哥    时间: 2016-3-16 18:12
我是王觉瘦 发表于 2016-3-16 01:44
简单说缓冲区就是一个池子.把输入的文件汇总到这个池子里面.然后计算机再从池子里读取.首先count没有声明和 ...

您精准的回答了我提出的问题,给我解惑了。
我非常感谢。
作者: 叫我超哥    时间: 2016-3-16 18:23
菜逼 发表于 2016-3-16 00:50
一个水果(char)篮,里面有香蕉(int),苹果(float),葡萄(double)等等

叫你拿香蕉,你就只会拿香蕉

哥们你举的真通俗,但是
我有点疑惑,是不是定义变量时都可以定义为char型,因为它适合所有格式
char type = 'a'/ type = 1 /type = 1.00f /type  = 1.1
这样行吗?

作者: chensc    时间: 2016-3-16 20:19
学习学习!
作者: 爱尘iPhone    时间: 2016-3-16 21:29
66 加油 加油
作者: wx_MkPtTU4D    时间: 2016-3-16 23:16





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2