Странное поведение с параметрами функции и getch()

Я сталкиваюсь с некоторым странным поведением с вызовом функций с параметрами, которые содержат getch().

Возьмите следующий код для примера:

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

    printf("%c\n", c);

    return 0;
}

/*
 * 
 */
int main(int argc, char** argv) {
    while(1)
    {
        IsKeyDown('a');
        IsKeyDown('b');
        Sleep(100);
    }
    return (EXIT_SUCCESS);
}

Когда нажата клавиша с этим кодом, не смотря ни на что, он всегда будет печатать "а", который является параметром первой функции. Проблема в том, что "a" не является параметром вызываемой второй функции, но вместо "b" все еще печатается "a". Почему это происходит?

1 ответ

Подумайте об этом: что делает ваша программа? Вы ударили персонажа на клавиатуре. Когда main заканчивает спать, он вызывает функцию с "a". Так как kbhit имеет значение true, он напечатает "a". Затем, немедленно, он вызывает IsKeyDown() снова. Поскольку kbhit теперь имеет значение false, он возвращается, ничего не печатая. Затем главный снова спит, и он начинается снова.

Чтобы проверить это, измените IsKeyDown, чтобы он возвращал 1, если он получает символ. Затем в основном проверьте возвращаемое значение, чтобы увидеть, что происходит.

Другие вопросы по тегам