只要在Windows下用過C/C++就會很熟悉conio.h
庫中的一個函數getch()
,它能夠繞過終端輸入緩衝區直接從鍵盤讀取一個字符,而且不在界面上顯示。html
但若是想直接在Linux環境下用是不行的,由於沒有conio.h
庫的支持。函數
博主翻了網上的一些資料,在這裏給出一個比較簡明的實現,使用起來與Windows下沒什麼差別。字體
#include<cstdio> #include<cstdlib> inline char getch(){ static char ch; system("stty -icanon -echo"); scanf("%c",&ch); system("stty icanon echo"); return ch; }
不知道你們有沒有遇到這樣的問題:平時所見的輸入語句都須要等待咱們輸入完纔會執行完成,什麼都不作的話就會一直阻塞在那裏。但咱們有時想讓程序在嘗試接收讀入失敗的時候可以繼續執行下去。這樣要怎麼實現呢?code
咱們須要一個函數fcntl
,包含在fcntl.h
中。使用它能夠取消輸入阻塞。關於它的更詳細的內容能夠百度。htm
咱們還須要一個函數read
,包含在unistd.h
中,是一個底層的輸入函數。blog
定義一個CustomGetch
類,包含構造函數、析構函數和運算符()
重載,再定義一個該類變量getch
,用起來就像函數同樣。get
#include<cstdlib> #include<fcntl.h> #include<unistd.h> class CustomGetch{ public: CustomGetch(){ fcntl(0,F_SETFL,O_NONBLOCK); system("stty -icanon -echo"); } ~CustomGetch(){ fcntl(0,F_SETFL,0); system("stty icanon echo"); } inline char operator()(){ static char ch; return ~read(0,&ch,1)?ch:EOF; } }getch;
這樣寫有一個侷限性:在這個變量的生存週期內,不能和其它的輸入方式兼容。所以有兩種處理方案:博客
getch()
而不須要其它輸入方式的語句塊內定義臨時變量。getch()
同樣寫成函數。但考慮到實際應用中要頻繁調用這個函數對輸入流進行檢查,而system
操做至關耗時,因此不推薦這樣作。由於system("clear")
是個假的清屏,因此咱們須要更好的實現。io
printf("\033c");
對,沒了,就一行。class
程序示例
#include<cstdio> #include<cstdlib> int main(){ for(int i=0;;++i){ printf("\033c"); for(int j=0;j<4;++j)puts(1&i?"abcdefg":"abcbefg"); system("sleep 1"); } return 0; }
Linux終端有專門的轉義字符。看這個博客