2014-07-17 36 views
0

我想清除輸入緩衝區,但不知道怎麼回事,繼承人的代碼,請嘗試自己:

結算用戶輸入緩衝器/ C++

#include <windows.h> 

using namespace std; 

int main() 
{ 
    do { 
     Sleep(500); 
     if (kbhit()) 
      cout << (char) getch() << endl; 
    } while(1); 
} 

如果我的垃圾郵件按鍵盤,信件會逐一打印,每個信件延遲500ms。

如何清除整個輸入緩衝區,只有一個字母會出現即使我按下多個

+1

我很確定'kbhit'和'getch'不可用於''。你真正的包括什麼名單? –

+0

真的很重要嗎?我包括,但窗口是需要的延遲,現在可以幫助我嗎? – gsdag

+0

當你使用'getch'而不是'getchar'時什麼輸入緩衝區? 'getch'只是直接獲得字符值,而不需要等待任何輸入按鍵或任何東西。編輯:沒關係... – ThoAppelsin

回答

0

所以你正在寫一個Windows控制檯應用程序。不是DOS,也不是跨平臺兼容的。

您可以使用Windows控制檯功能。請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

特別是您可以使用GetStdHandle獲取句柄,然後使用句柄上的WaitForSingleObject。可能會有500 ms的超時而不是當前的睡眠。

然後,您應該能夠通過ReadConsole讀取自上次讀取以來緩衝的所有輸入。如果你想要第一個字符或最後一個字符,你只需要一個。

有很多細節需要添加到所有實際工作中。

+0

會不會比上面描述的方法更復雜,使用getch()和kbhit()?或者有什麼我想念的? – gsdag

0

這種取決於你想要的行爲是如何。既然你沒有詳細指定,這裏有兩個,我會提供:

// ... 
do { 
    Sleep(500); 
    if (kbhit()) { 
     cout << (char) getch() << endl; 
     while (kbhit()) 
      getch(); 
    } 
} while (1); 
// ... 

加入裏面就有了while循環,清除緩衝區內其餘的按鍵。它通過檢查條件是否存在剩餘擊鍵來做到這一點,在這種情況下丟棄它。

雖然這似乎是你想從你問的方式,我想建議以下,這會覺得在我看來更順暢:

// ... 
do { 
    cout << (char) getch() << endl; 
    Sleep(500); 
    while (kbhit()) 
     getch(); 
} while (1); 
// ... 

它變得更順暢韓元的方式沒有太多的認識,像500延遲,但提高到2500,你可能明白我的意思。在第一個版本中,您的擊鍵將始終延遲0 ~ 500/2500毫秒;而在第二個版本中,如果你的擊鍵出現(即被壓出冷卻時間),你的擊鍵就會立即出現。

+0

謝謝你,那正是我正在尋找的東西,只是解釋你爲什麼我需要第一個選項。我正在做一個蛇遊戲(第一個更大的項目),我希望蛇即使沒有按下鍵仍然移動(這就是爲什麼如果(kbhit())),不能等待輸入,因爲等待輸入蛇(幀)不移動在所有。你也可以向我建議任何有趣的大型遊戲機項目嗎?問候。 – gsdag

+0

@gsdag沒問題兄弟。將你的蛇項目擴展成一個多人遊戲(兩個玩家使用相同的鍵盤,WASD和箭頭),首先設計遊戲玩法;或者是一個單人和多人遊戲,單獨面對永不失敗的AI(並非不可能,我個人知道在任何情況下都可以防止丟失的算法)。還是別的什麼,我不知道。 – ThoAppelsin

+0

是的,我已經完成了tic tac toe,但是這個蛇的想法相當不錯!我還有什麼可以編程C++,因爲我只被教過控制檯程序,我可以用C++製作遊戲/應用程序/其他任何有用的東西嗎? – gsdag