嵌入式 关于scanf("%c",&ch)实现拦截时候出现直接跳过的问题

原创 2013年12月02日 14:58:30

过去上论坛,还有最近写程序,老是有人遇到这样的问题:就是有时候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);

相关文章推荐

C/C++经典问题:[未输入字符,输入语句被直接跳过] 的多种解决方案

比如: 原因:输入了xx,然后一个回车后,回车的结果是,除了“xx”还向标准输入流(stdin)输入了一个换行符'\n'(c/c++),而scanf/gets/cin只吸收了xx,而'\n'...

我的嵌入式学习笔记(2)--scanf使用常见问题及解决方法

在学习C语言的时候,printf()是我们学到的第一个函数,相信“hello world”这个例子大家都不会陌生吧,接着就是scanf()这个函数了,这个函数的功能是格式输入,它的函数原型是:...

嵌入式处理器_Ch6_S3C44B0.ppt

  • 2009年03月07日 18:05
  • 13.05MB
  • 下载

C语言学习笔记——scanf("%c",&ch) 读取字符

scanf("%c", &ch)  读入由终端输入的第一个字符。输入“Enter”后执行函数。因此每次输入n个字符时,I/O缓冲区中实际存储了n+1个字符,即n个输入的字符和一个换行字符(\n)。而s...

scanf("%c", &ch) & 回车

想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。 现在假设你的缓冲...
  • gai_ge
  • gai_ge
  • 2012年02月19日 21:37
  • 714

由scanf("%d",&ch);引出的输入缓冲区问题

刚才一个朋友发了一段代码: #includestdio.h> int main(void) {     int i;     char c;     for(i=0;i5;i+...
  • VMA_LMA
  • VMA_LMA
  • 2013年03月05日 17:02
  • 452

嵌入式学习8(scanf函数的注意事项)

scanf 1、 一条语句对多个变量复制 Ø  注意用户的输入要与设定一致 如果为scanf("%c%c%c"),那么输入的时候就必须连续输入3个字符,中间不能有任何空格逗号或者回车符等分开 ...

跳过登陆页面直接访问该jsp文件了,这样不好,请问大家如何避免这种问题?

原文:http://zhidao.baidu.com/question/68705585 百度知道问题: jsp安全性问题,当别人知道某个jsp文件的网址后就可以跳过登陆页面直接访问该jsp文件了...

c嵌入式程序员应知道的几个基本问题

转载的,地址忘了。 想成为嵌入式程序员应知道的几个基本问题   C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带...

android实现静默安装和跳过卸载弹窗直接卸载应用

实现静默安装和卸载应用 前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译...
  • gbk188
  • gbk188
  • 2014年04月17日 09:59
  • 2633
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 关于scanf("%c",&ch)实现拦截时候出现直接跳过的问题
举报原因:
原因补充:

(最多只允许输入30个字)