C 延迟无限循环中奇怪的 kbhit() 行为

标签 c loops kbhit

我一直在使用 kbhit() 测试一些东西,并发现了延迟无限循环的奇怪行为。在此代码示例中,我将循环延迟为每秒运行 30 次。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

_Bool IsKeyDown(char c)
{
    if(kbhit())
    {
        char ch1 = getch();
        if(ch1 == c)
            return 1;
    }
    return 0;
}

/*
 * 
 */
int main(int argc, char** argv) {
    while(1)
    {
        if(IsKeyDown('a'))
        {
            printf("HELLO\n");
        }
        if(IsKeyDown('b'))
        {
            printf("HI\n");
        }
        Sleep(1000 / 30);
    }
    return (EXIT_SUCCESS);
}

问题是,虽然循环中的第一个 if 语句工作正常,但第二个 if 语句几乎不起作用。如果在此示例中按住“a”键,则会无限期地打印 HELLO。如果按住“b”键,则几乎不会打印 HI(如果有的话)。

为什么会出现这种行为?

最佳答案

发生这种情况是因为当 kbhit 返回 true.由于您连续调用 IsKeyDown 两次,第一次调用会“吃掉”'b',因此当运行第二次调用时,缓冲区。

您需要重新组织代码,以便每次循环迭代仅调用 IsKeyDown 一次。您的循环应该存储其返回值,并将存储的值与您需要的字符进行比较(即 'a''b'):

int GetKeyDown() {
    if(kbhit())
    {
        return getch();
    }
    return -1;
}

while(1)
{
    int keyDown = GetKeyDown();
    if(keyDown == 'a')
    {
        printf("HELLO\n");
    }
    if(keyDown == 'b')
    {
        printf("HI\n");
    }
    Sleep(1000 / 30);
}

关于C 延迟无限循环中奇怪的 kbhit() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21074310/

相关文章:

c - 计算机是否为数组的变量名分配内存?

c - 启动 Blackfin (BF527)

c - 为什么使用不同的循环会得到不同的输出?

python - PyCharm:msvcrt.kbhit() 和 msvcrt.getch() 不起作用?

c - 二进制、 float 和现代计算机

c - 将空程序参数 vector 传递给 execve() 是否合法?

PhP mysql插入语法错误

loops - 一个循环中有两个变量

forEach 循环中的 Javascript API 队列

我可以在终端游戏中显示实时反馈吗?