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

键盘输入缓冲区与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后退出循环和函数。
所以就有了上面的问题!

你可能感兴趣的:(项目相关)