今天我在uni開始了我的第一個'編程基礎'實驗課。但有一件事讓我覺得很奇怪:使用conio.h中的while(! _kbhit())
(我確定它是一個C單元?)來暫停控制檯輸出。使用kbhit()暫停終端輸出?
這是最好的方法嗎?使用它時需要注意什麼?我的導師絕對是瘋子嗎?我只問,因爲它看起來有點骯髒的黑客,我從來沒有見過它在我看過的任何C++代碼片段。
將問題標記爲家庭作業,因爲它與學校有關,但實際上並不是作業任務。如果這個問題比CW好,請告訴我。
今天我在uni開始了我的第一個'編程基礎'實驗課。但有一件事讓我覺得很奇怪:使用conio.h中的while(! _kbhit())
(我確定它是一個C單元?)來暫停控制檯輸出。使用kbhit()暫停終端輸出?
這是最好的方法嗎?使用它時需要注意什麼?我的導師絕對是瘋子嗎?我只問,因爲它看起來有點骯髒的黑客,我從來沒有見過它在我看過的任何C++代碼片段。
將問題標記爲家庭作業,因爲它與學校有關,但實際上並不是作業任務。如果這個問題比CW好,請告訴我。
一個非常快速(易記)這樣做的方法是使用getchar
:
getchar();
您可能必須按進入後返回你的字符,取決於stdin
的緩衝模式。你大概可以用setvbuf
來解決這個問題,但是我個人總是按回車。
您也可能正在使用C++ iostreams。在這種情況下,你要調用這個地方:
std::ios::sync_with_stdio(true);
區別在於調用'getchar'消耗'stdin'中的字符,而調用'_kbhit'不會,它只是告訴你控制檯輸入是否準備好讀取(並且避免緩衝,我認爲)。這並不是說忙碌循環是一個好主意,或者功能上的差異一定很重要。 – 2010-09-30 02:01:49
'fflush(stdin)'調用未定義的行爲。 – 2010-09-30 03:39:27
刪除了對fflush的引用 - 謝謝。 (不要問我爲什麼要開始這樣做;我已經使用這段代碼超過10年了......) – 2010-09-30 11:23:42
使用conio.h
(或更糟的是,撥打pause
或使用system
的類似實用程序)通常是一個壞主意;它不是很便攜。相反,人們可以使用cin
功能:
#include <iostream>
#include <limits>
/* Either of these would work, AFAIK */
void pause() {
std::cin.ignore(std::numeric_limits<std::streamsize>::max());
std::cin.get();
}
void pause() {
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get();
}
void pause() {
std::cin.sync();
std::cin.get();
}
'conio.h'不是標準C,而且有更好的,更多的平臺無關的,符合標準的方式在C這樣做++(和C,IIRC)。 – You 2010-09-29 23:11:53
這就是我認爲,說實話 - 這不是一個符合標準的用法。 – 2010-09-29 23:13:45