黑马程序员技术交流社区

标题: 关于scanf()函数缓存区的问题,欢迎交流 [打印本页]

作者: 408205555    时间: 2015-7-18 20:41
标题: 关于scanf()函数缓存区的问题,欢迎交流
看了大师的视频,对scanf函数的缓存区的问题一知半解,请了解的朋友详细解释一下,不胜感激~

代码:
char ch='';                 //定义变量
int count=0;              //定义变量
scanf("%c",&ch);        //接收用户输入
while(ch!='\n'){          //当ch的值不是\n时(\n为按键盘回车输入进来的值)
       scanf("%c",&ch);
}

大师在视频中写到:
scanf的原理是:如果缓存区不为空,不会让用户再次输入内容,而直接从缓存区中继续获取.

疑问:假如我先输入个a,a!="\n"代码就会进入到循环。输入完a后还可以继续输入,因为scanf函数的缓存区已经有了一个a了啊,怎么还可以继续输入字符?上面说缓存区不为空用户是不可以输入的啊(也就是说缓存区只有在空的情况下,才可以继续输入的)。
作者: 紫荆秋雪    时间: 2015-7-18 21:57
我是这样理解的,当第一次输入a的时候,如何你此刻回车那就不会进到while循环里;当你继续输入的时候就要进入while循环里面,你可以任意输入直到你输入‘\n’为止,之后你可以打印输出你的输入内容,你可以全部打印输出也可以部分输出,当你是部分输出的时候由于存储空间还存有内容,这是是不能再输入的?老师应该说的是此刻不能再输入了。
作者: 杨远鹏    时间: 2015-7-18 22:45
你列举的例子是:
scanf(“%c”,&a);
scanf(“%c”,&b);
scanf(“%c”,&c);
......
这种情况是每个scanf函数都有各自的缓冲区,就是有多个缓冲区的情况。
而老师讲的那种情况是,一个scanf函数输入多个字符scanf(“%c%c%c”,&a,&b,&c);的情况,这种就只有一个缓冲区。
这两种情况要分清楚哦~
作者: 杨远鹏    时间: 2015-7-18 22:48
http://bbs.itheima.com/thread-212811-1-1.html
这是我之前发的帖子,和你说的是一个意思。
作者: zpy_0806    时间: 2015-7-18 22:55
顶一个!
作者: 落水的兔子    时间: 2015-7-19 12:07
a不是已经存放到ch里面了吗,判断一次之后不是又重新接收字符吗
作者: llo    时间: 2015-7-19 12:29
落水的兔子 发表于 2015-7-19 12:07
a不是已经存放到ch里面了吗,判断一次之后不是又重新接收字符吗

缓存里面已经有数据后  他会先从缓存中读取
作者: 408205555    时间: 2015-7-21 20:24
紫荆秋雪 发表于 2015-7-18 21:57
我是这样理解的,当第一次输入a的时候,如何你此刻回车那就不会进到while循环里;当你继续输入的时候就要进 ...

后来我弄了好半天才理解了老师说的是这个意思。
因为只有一个scanf(),所以只有一个缓存区。
我是要接收一个char类型的数据,所以当用户输入的abcd的时候只能接收到一个a,
其余的bcd还在缓存区中。。
作者: 408205555    时间: 2015-7-21 20:25
杨远鹏 发表于 2015-7-18 22:45
你列举的例子是:
scanf(“%c”,&a);
scanf(“%c”,&b);

嗯,你说的对!
作者: wdcew    时间: 2015-7-21 20:39
看过后有一种恍然大悟的感觉!!!!
作者: 408205555    时间: 2015-7-21 21:37
wdcew 发表于 2015-7-21 20:39
看过后有一种恍然大悟的感觉!!!!

多多交流:lol
作者: 我的呸    时间: 2015-7-22 08:32
看过发现自己也不是很明白
作者: 被水淹死的鱼    时间: 2015-7-22 09:08
不太懂。。。
作者: 408205555    时间: 2015-7-23 12:04
我的呸 发表于 2015-7-22 08:32
看过发现自己也不是很明白

多敲代码试试
作者: GodLovenan    时间: 2015-7-23 12:04
表示还没看到while语句 下午看!




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