清除键盘缓冲区
来源:互联网 发布:手机三维扫描软件 编辑:程序博客网 时间:2024/06/12 20:30
关于清除键盘缓冲区残余信息问题~循环scanf()可能导致直接读入' \n...
#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);
/*printf("c=%d\n",c);*/
}while(c!='N');
} scanf("%c",&c);
这句不能正常接收字符,什么原因呢?
我们用printf("c=%d\n",c);将C用int表示出来,启用 printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是什么,结果是 c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里 \r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.
也就是说:scanf()和getchar()函数是从输入流缓冲区 中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!因此后面只要加上fflush(stdin)函数释放缓冲区数据就可以了.
解决办法:可以在两个scanf()函数之 后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。
函数名: fflush
功 能: 清除一个流
用 法: int fflush(FILE *stream);#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c);
}while(c!='N');
}
这里再给一个用“空格符”来处理缓冲区残余信息的示例:
运行出错的程序:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
}
使用了空格控制符后:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
}
可以运行看看两个程序有什么不同。
- 清除键盘缓冲区
- 清除键盘缓冲区
- Fgets使用以前一定要清除键盘缓冲区 fflush(stdin)
- 清除缓冲区
- 清除缓冲区
- 清除缓冲区
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- 流缓冲区与键盘缓冲区
- 输入缓冲区清除
- cin 清除缓冲区
- 清除输入缓冲区
- linux 下清除缓冲区
- GCC清除缓冲区
- c清除缓冲区数据
- 清空键盘缓冲区
- C语言清除输入缓冲区
- 1321. Robot
- 上班族创业前的思考:如何马上入手?
- window.open()理解以及如何用window.open()实现窗口关闭
- 7.4过虑流与包装类
- bitset 用法整理
- 清除键盘缓冲区
- 鬼影3样本MBR详细注释(好吧,继续友情赠送磁盘布局..)
- 十六 进制CString 型字符串转为相应的字节型数据
- IBM DB2 数据库使用小技巧
- windows控制台下光标移动
- (一)android开发环境搭建-2011-3-23
- 综合习题
- 常见软件测试面试题
- zz[内部泄露邮件]开心网上市遇阻,又爆发“应届生门”,开始大量