清空输入缓冲区是什么意思 有什么用
发布网友
发布时间:2022-04-29 21:41
我来回答
共1个回答
热心网友
时间:2022-06-23 12:05
/*
1)给出下面这个测试程序。
2)我们约定输入数据为:
a(enter 键)
b(enter 键)
c(enter 键)
d(enter 键)
*******************************
当你 fflush(stdin); 被注释掉时 ,输出结果是:
a --输入
a --对应输出
我是一个回车 --对应输出
b --输入
b --对应输出
我是一个回车 --对应输出
c
c
我是一个回车
d
d
我是一个回车
*******************************
当你 fflush(stdin); 没有被注释掉时 ,输出结果是:
a --输入
a --对应输出
b --输入
b --对应输出
c
c
d
d
*******************************
3)说明
fflush 函数就是清空【输入缓冲区】的操作。
比较 fflush(stdin); 被注释掉时和 fflush(stdin); 没有被注释掉时的效果,
可以看到区别是 "我是一个回车" 这句输出。
"我是一个回车"其实对应于'\n',为了更加直观看到'\n'因此用一句话代替它。
为什么会有这个区别呢?
当我们输入 "a(enter 键)" 是,【键盘输入缓冲区】里面其实保存了两个【按键A】【按键enter】
的【键值】。另外有个,当前是指向 【按键A】的。
调用 scanf 函数是,本质的操作就是从 【键盘输入缓冲区】里面读取数据流。
调用 scanf("%c",&c) 是从【键盘输入缓冲区】中【读取一个字符】(这里是当前指向的【按键A】),
同时【键盘输入缓冲区的指针】向后移动,【按键enter】。
如果接下来没有【清空将键盘输入缓冲区】,下一次调用 scanf("%c",&c) 时,
从【键盘输入缓冲区的指针】当前指向的位置【读取一个字符】,读到的将是 【按键enter】,
同时【键盘输入缓冲区的指针】向后移动,指向了【键盘输入缓冲区】的末尾。
如果接下来【清空将键盘输入缓冲区】,则【键盘输入缓冲区的指针】将指向【键盘输入缓冲区】的末尾。
下一次调用 scanf("%c",&c) 时,【清空将键盘输入缓冲区】没有数据了,
因此会重新等待用户从键盘输入。
总结:
没有 fflush(stdin); 时,a(回车) 相当于输入两个字符
有 fflush(stdin); 时,a(回车) 只读取第一个字符
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char c;
while(1)
{
scanf("%c",&c);
if(c=='\n')
printf("我是一个回车\n");
else
printf("%c\n",c);
fflush(stdin);
}
return 0;
}