键盘输入缓冲区与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后退出循环和函数。
所以就有了上面的问题!
键盘缓冲区用来缓存“按键”的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后退出循环和函数。
所以就有了上面的问题!
相关文章推荐
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- C语言scanf函数输入时键盘缓冲区\n的问题
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- Scanf()—键盘缓冲区残余信息和误输入造成程序死锁或出错问题
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- C语言编程在Xcode中Scanf 输入跳过以及清空键盘缓冲区总结
- scanf输入跳过及清空键盘缓冲区总结
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- 关于C语言使用输入函数后键盘缓冲区还有多余字符没的问题
- c++获取键盘输入cin、scanf使用详解
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- Objective-C初探-scanf 键盘输入
- 由scanf("%d",&ch);引出的输入缓冲区问题
- c++获取键盘输入cin、scanf使用详解
- fflush(stdin) 清除Scanf输入缓冲区
- 由scanf("%d",&ch);引出的输入缓冲区问题
- 3. 定义10个字节的键盘缓冲区,然后键盘输入字符填满该缓冲区,做如下工作: (1)分别将输入键盘缓冲区的字符按数字,小写字母,大写字母,其他字符进行计数; 分别将这些计数值显示出来。 (2)分别将这
- 关于fflush(stdin)的使用与scanf输入缓冲区的问题
- 一个字符变量存储到动态分配内存引发的输入问题解决--连续输入scanf函数存在缓冲区的问题