关于kbhit()与getch()组合的猜测

kbhit:非阻断函数,运行时不会暂停程序,作用是若有键盘输入,则返回输入的值(应该是键值转换),若没有则返回0。
getch:阻断函数。等待键盘输入,并在输入后立即返回第一个字符,无需按下回车

将以下代码嵌套至while(1)内循环:

void move()
{
    char a;
    bool b;
    b=kbhit();
    if(b)
    {
        a=getch();
        cout<<"yes__________________________________________________________________________________-";
    }
    else
    {
        cout<<"no  "<<a;
    }
}

能够实现持续获得键盘输入,即类似于贪吃蛇等游戏的实时反馈功能。

但是如果将代码中的a=getch()删除,或给a赋值任意常量。

则该功能失效。

测试过程中发现:

kbhit()与getch()组合时,kbhit()的值初始为false,按键后为true,在经过getch()后再次变为false。

删除getch()之后,kbhit()的值初始为false,按键后为true,此后一直为true,不再改变。

 

根据测试过程猜测:

1.kbhit()会根据某一标准判断是否按键,并根据该标准改变值

2.由于getch()具有读取键盘缓存区数据的功能,因此推测kbhit()的改变是由于getch()对于缓存区数据读取造成,即:

kbhit对于是否按键的标准为==>键盘缓存区是否有数据存储

 

这样一来就可以解释为何kbhit()与getch()组合是产生的功能:键盘按键后,键盘缓存区存入数据,kbhit()随之改变值。之后进程调用getch(),getch()读取缓存区内数据,缓存区清零。再次调用kbhit()时,

此时由于缓存区数据已被getch()读取清零,所以kbhit()再次改变值。

 

以上仅为个人猜测。

 

posted @ 2021-05-27 20:15  Silke  阅读(327)  评论(0)    收藏  举报