您的位置:首页 > 其它

键盘输入缓冲区与scanf()原理

2008-06-05 15:01 375 查看
键盘输入缓冲区与scanf()原理。

键盘缓冲区用来缓存“按键”的ASCII码,而scanf()每次从键盘缓冲区中读取一个字符(ASCII码),直到
键盘缓冲区为空。如果键盘缓冲区为非空状态,执行scanf()不会要求输入,如果键盘缓冲区为空,执行
scanf()则会等待用户的输入。

例如:执行下面的代码

char a;
while(1)
{
scanf("%c",&a);
}

第一次执行scanf输入:“abcdefg回车”
那么2--8次scanf都不再需要输入
第9次执行scanf又要求输入:......

从使用scanf()遇到的问题说起:

写了一个Console程序用于做测试,主要是想要程序根据键盘输入来做出相应的响应,部分程序代码如下:

char a;
while( 1 )
{
scanf("%c",&a); // 第一次循环这里将等待输入,而第二次循环时不需要输入了!!
switch (a)
{
case '1':
...

break ;
case '2':
...

break ;
case '3':
...

break ;
case 'e':
return 0;
default:
return 0;
}
}

运行后发现一个问题,不管我输入什么,例如1、2、3,再按Enter键,循环都会退出。
我的本意是用户使用1、2、3三个键做相应的选择,e键和其它输入退出,但现在是连1、2、3键也会退出?
这是怎么回事呢?

首先我们来看看while循环的过程:

进入while循环,第一次执行 scanf("%c",&a);语句:假设输入1并回车。

当输入”1和回车键“后,键盘缓冲区将保存它们的ASCII码:33 13 10,但是因为scanf("%c",&a);语句
将把ASCII码33送入a中,所以第一次执行完scanf("%c",&a);语句后,键盘缓冲区中剩下的内容为:
13 10,然后进入switch语句,因为现在a='1',所以执行case '1'分支,break后继续while循环,开始
第二次执行scanf("%c",&a);语句,但这次程序不会停下来等待输入,因为键盘缓冲区中还有剩余的
ASCII码:13 10。因此第二次执行scanf("%c",&a);语句时,程序直接将缓冲区中的ASCII码13送入a中,
接着又进入switch语句,但是现在a='/r',所以转到default分支,执行return后退出循环和函数。
所以就有了上面的问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐