嵌入式 关于scanf("%c",&ch)实现拦截时候出现直接跳过的问题
2013-12-02 14:58
267 查看
过去上论坛,还有最近写程序,老是有人遇到这样的问题:就是有时候scanf("%c",&ch)本应该阻塞等待用户输入一个char型数据的,但为什么会跳过呢?
纠其根源,我们先来了解一下scanf()是怎么接受数据的。
首先,当我们的pc指向scanf这句时,系统并不是等待用户输入,而是判断输入缓冲区有没有符合格式的内容,如果有,则直接读取。
知道了这个,我就应该明白,scanf("%c",&ch);不是没有读到数据,而是读到了我们不知道的数据。
那问题又来了,它读到了什么??
好吧,这就要说到行缓存;
我们用scanf()的时候都要按下enter键,那enter键按了之后去哪儿了??
好吧,问题基本应该知道了,enter键也进入了输入缓存区,也就是scanf("%c",&ch);
读到了'\n';
解决办法,很简单,既然缓存区有东西,那我们就清空它呗~~
setbuf(stdin,NULL);(这个windows和linux下都可以)
fflush(stdin);(这个只能windows);
纠其根源,我们先来了解一下scanf()是怎么接受数据的。
首先,当我们的pc指向scanf这句时,系统并不是等待用户输入,而是判断输入缓冲区有没有符合格式的内容,如果有,则直接读取。
知道了这个,我就应该明白,scanf("%c",&ch);不是没有读到数据,而是读到了我们不知道的数据。
那问题又来了,它读到了什么??
好吧,这就要说到行缓存;
我们用scanf()的时候都要按下enter键,那enter键按了之后去哪儿了??
好吧,问题基本应该知道了,enter键也进入了输入缓存区,也就是scanf("%c",&ch);
读到了'\n';
解决办法,很简单,既然缓存区有东西,那我们就清空它呗~~
setbuf(stdin,NULL);(这个windows和linux下都可以)
fflush(stdin);(这个只能windows);
相关文章推荐
- 嵌入式 实现自己的printf函数小示例
- 嵌入式 C语言中.h和.c文件解析经典收藏
- 嵌入式 用链表实现直接选择排序和直接插入排序示例
- 嵌入式 一个简单的个人通讯录(基于二叉排序树,带注释)
- 嵌入式 线性表(顺序表,链表)示例
- 嵌入式 select用于实现I/O多路复用示例
- 嵌入式 一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
- 嵌入式 makefile编译静态库和动态库(
- 嵌入式 ubuntu12.04下tftp安装、配置、测试
- mysql installer 无法选择install path
- 1010 [HNOI2008]玩具装箱toy
- 30天自制操作系统笔记(九十)
- 嵌入式 ioctl变成了unlocked_ioctl解释
- 嵌入式 linux下的模块加载详解
- 嵌入式 servfox分析
- 嵌入式 C语言测试:想成为嵌入式程序员应知道的0x10个基本问题详解
- 嵌入式 c语言orC++语言经典面试题汇总
- 嵌入式 Linux下判断是否是一个目录还是一个文件的方法
- 嵌入式 strtok分割字符串示例
- 隐藏android bar