Question as follows :
Adam:因為不是經常用到,所以我總是記不住如何實現這個功能。在 C/C++ 中,不用到下一行(輸入回車)就從標准輸入獲得字符最好的方法是什麼呢?
另外如果不用把字符敲入屏幕那肯定是最完美的,但我僅僅想不通過敲控制台(Enter)就獲得鍵盤輸入。
Some answers:
Best one,來自 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 可以在跨平台跨終端的環境中幫你處理好這個。
Sone of codes:
From Kay:
這段代碼使用 kbhit() 檢查鍵盤是否被按下,並用 getch() 獲取輸入的字符。
#include <conio.h>
if (kbhit()!=0) {
cout<<getch()<<endl;
}
來自Falcon Momot:
在 Linux(或者其他類 UNIX 系統)中可以這樣實現:
#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);
}