2010-09-29 32 views
1

今天我在uni開始了我的第一個'編程基礎'實驗課。但有一件事讓我覺得很奇怪:使用conio.h中的while(! _kbhit())(我確定它是一個C單元?)來暫停控制檯輸出。使用kbhit()暫停終端輸出?

這是最好的方法嗎?使用它時需要注意什麼?我的導師絕對是瘋子嗎?我只問,因爲它看起來有點骯髒的黑客,我從來沒有見過它在我看過的任何C++代碼片段。

將問題標記爲家庭作業,因爲它與學校有關,但實際上並不是作業任務。如果這個問題比CW好,請告訴我。

+0

'conio.h'不是標準C,而且有更好的,更多的平臺無關的,符合標準的方式在C這樣做++(和C,IIRC)。 – You 2010-09-29 23:11:53

+0

這就是我認爲,說實話 - 這不是一個符合標準的用法。 – 2010-09-29 23:13:45

回答

2

一個非常快速(易記)這樣做的方法是使用getchar

getchar(); 

您可能必須按進入後返回你的字符,取決於stdin的緩衝模式。你大概可以用setvbuf來解決這個問題,但是我個人總是按回車。

您也可能正在使用C++ iostreams。在這種情況下,你要調用這個地方:

std::ios::sync_with_stdio(true); 
+0

區別在於調用'getchar'消耗'stdin'中的字符,而調用'_kbhit'不會,它只是告訴你控制檯輸入是否準備好讀取(並且避免緩衝,我認爲)。這並不是說忙碌循環是一個好主意,或者功能上的差異一定很重要。 – 2010-09-30 02:01:49

+0

'fflush(stdin)'調用未定義的行爲。 – 2010-09-30 03:39:27

+0

刪除了對fflush的引用 - 謝謝。 (不要問我爲什麼要開始這樣做;我已經使用這段代碼超過10年了......) – 2010-09-30 11:23:42

2

使用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(); 
}