我一直在用kbhit()測試一些東西,並發現了一個帶有延遲死循環的奇怪行爲。在這個代碼示例中,我將循環延遲爲每秒運行30次。C在延遲的無限循環中出現奇怪的kbhit()行爲
#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語句幾乎沒有功能。如果您在本例中按住'a'鍵,HELLO將無限期地打印。如果按住'b'鍵,HI幾乎不會被打印。
爲什麼會發生這種情況?
您的'b'被'a'getch()吸收。你應該首先getch()然後檢查哪一個是那個,所以第二個不會因爲第一個而被忽略。 – Vladp
因爲'getch()'被定義爲'int getch(void)',所以在使用'getch()'時,你還應該使用'int'而不是'char'。 – pzaenger