当前位置: 代码迷 >> 综合 >> scanf、getchar()是直接从键盘拿取吗?中间有没有介质?
  详细解决方案

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

热度:76   发布时间:2023-11-22 21:41:08.0

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的问题就大概是这样。