scanf、getchar()是直接从键盘拿取吗?中间有没有介质?

scanf与getchar,从键盘读取数据,但不是从键盘直接去拿!!!

在scanf、getchar函数与键盘中间维护一个缓冲区。

下面是一个从键盘输入密码、确认密码的例子。

当scanf读数据的时候他去看缓冲区(这时缓冲区里面什么也没有)当缓冲区刚刚运行起来的时候,里面什么也没有,scanf就等待(等我们从键盘输入东西到缓存区),当我们输入之后(比如输入了123456),按了一个回车(\n),这时我们相当于在缓存区放了一个123456\n,然后scanf就拿走了123456,因为\n是我们输入完后确认点了回车,但是缓存区里面还有一个\n,然后getchar就把缓存区里面的\n读取了放到ch里面,所以getchar没有等待我们输入,因为ch读走了\n,但是与字符’Y’不相等,所以确认失败。
处理方法1:  “清理\n”
在确认密码之前拿走缓存区的\n,重新确认密码,所以在确认密码之前加上一句getchar拿走\n。(这个办法有缺陷)

 

缺陷:假如我输入:12345 6789(5与6中间有个空格)按回去之后,还是出现确认失败的问题。
为什么?(不是加了getchar吗?)
当我们输入12345 6789回车(\n)的时候,%s它只读空格之前的数字,所以scanf只读走了12345,还剩 6789(6前面还有一个空格),而gatchar读的时候只能处理一个字符(空格),剩下了6789\n,剩下的还是与字符’Y’不相等,所以还是读确认失败。(所以处理方式不合理、存在缺陷)

 

处理方法2
在确认密码之前添加代码如下:
int tmp=0;
while((tmp=getchar())!=’\n’)
             ; // while里面有一条空语句,分号可加可不加;但如果while没有大括号就必须加分号!
  }
运行结果如下:

 

这条语句相当于,只要读不到\n就一直读,把读到的字符放在tmp里面,直到读到\n,并且\n也被放到了tmp里面才能判断是否与\n相等,所以最后的回车(\n)也被放到了tmp里面(处理了一段字符包括\n)

所以scanf与getchar()在键盘拿取数据、getchar()怎么处理\n的问题就大概是这样。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值