題主問題
Adam:因為不是經常用到,所以我總是記不住如何實現這個功能。在 C/C++ 中,不用到下一行(輸入回車)就從標準輸入獲得字元最好的方法是什麼呢?
另外如果不用把字元敲入螢幕那肯定是最完美的,但我僅僅想不通過敲控制檯(Enter)就獲得鍵盤輸入。
最佳答案,來自 Johannes Schaub – litb:
只用純C++的話是不太可能滿足可移植性的,因為這很大程度上依賴於所使用的終端,其中終端連線了stdin(通常是行緩衝)。但是你可以使用某些庫來完成這個功能:
1.Windows 編譯器下可用 conio。使用 _getch() 函式讓你不用等待回車輸入就能得到字元。我不經常使用Windows來進行開發,但是我見過我同學僅僅包含標頭檔案 conio.h 就可以使用了。你可以在維基百科找到 conio.h 。上面列出了 getch() ,在 Visual C++ 中宣告為 deprecated(不贊成使用的)。
2.Linux 中可以使用 curses,在 Windows 中也可以使用相容的 curses 實現。相比於 conio 它也有一個 getch() 函式。(可通過 man getch 來檢視它的 manpage)。同樣你也可以在維基百科中找到 Curses。
如果你打算讓你的程式跨平臺執行的話,我推薦你使用 curses。然而我相信有一些你能用來關掉行緩衝的函式(我相信那應該叫做“原始模式”,與“加工模式”,詳細可以在 man stty 中檢視)。Curses 可以在跨平臺跨終端的環境中幫你處理好這個。
回答中的一些具體程式碼:
來自Kay:
這段程式碼使用 kbhit() 檢查鍵盤是否被按下,並用 getch() 獲取輸入的字元。
1 2 3 4 5 |
#include <conio.h> if (kbhit()!=0) { cout<<getch()<<endl; } |
來自Falcon Momot:
在 Linux(或者其他類 UNIX 系統)中可以這樣實現:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <unistd.h> #include <termios.h> char getch() { char buf = 0; struct termios old = {0}; if (tcgetattr(0, &old) < 0) perror("tcsetattr()"); old.c_lflag &= ~ICANON; old.c_lflag &= ~ECHO; old.c_cc[VMIN] = 1; old.c_cc[VTIME] = 0; if (tcsetattr(0, TCSANOW, &old) < 0) perror("tcsetattr ICANON"); if (read(0, &buf, 1) < 0) perror ("read()"); old.c_lflag |= ICANON; old.c_lflag |= ECHO; if (tcsetattr(0, TCSADRAIN, &old) < 0) perror ("tcsetattr ~ICANON"); return (buf); } |