不按回車就接受乙個字元輸入

2021-04-09 00:12:24 字數 2420 閱讀 4485

不按回車就接受乙個字元輸入!

記得前幾天的一篇日誌(

http://blog.csdn.net/anyue417/archive/2006/08/14/1064145.aspx)中寫到,像下面這樣的程式問題:

**如下:

#include

void main()

} 果然也只執行了3次,但不受什麼字元不字元,整型不整型的影響,我想每次我輸入乙個字元完了,我要鍵入乙個回車表示一次輸入的結束,是不是輸入流把回車也認為是乙個字元了,然後我算了下,加上回車恰好夠5次,然後我寫以下**測試:

#include

void main()

printf("%c",num);}}

今天我讀

這個「一次輸入乙個字元的」特性對於許多種類的軟體來說都是非常重要的,但對於pc而言卻是小菜一碟。c函式庫支援這個特性,通常使用乙個kbhit()的函式,如果乙個字元正在等待被讀取,它就會發出提示。microsoft ,borland 的c編譯器提供了了getch()(或getche(),它可以使字元在讀取的同時回顯在螢幕上來)來獲取單個字元,而不用等整行結束。

人們經常感到疑惑,為什麼ansi c 不定義乙個標準的函式來獲取一次按鍵後的字元。由於沒有一種標準的方法,每個系統都採用了不同的方法,這們樣便使程式失去了可移植性。反對將kbhit()納入標準的人認為:它在絕大多數情況下用於遊戲軟體的,而且還存在其他許多未標準化的終端i/o特性。另外,你可能並不想要乙個在某些作業系統中很難實現的標準庫函式。贊成它的人則認為:它在絕大多數情況下用於遊戲軟體,而遊戲編寫者並不需要很多的標準化的其它終端i/o特性。不論你支援哪個觀點,事實上x3j11小組還是錯過了乙個使c語言成為一代學生程式設計師在unix上編寫遊戲的一種選擇的機會(就是未吸納這個特性)。在unix中,有兩種方法可以實現逐個字元的輸入,一種很難,一種很容易。容易的方法就是讓stty程式來實現這個功能。儘管它是一種間接實現的方法,但對程式而言並無大礙。

#include

main()

最後一行system("stty cooked");是必要的,因為程式結束後,終端字元驅動特性的狀態將延續下去。在程式把終端設為一種滑稽的狀態之後,如果不作修改,它就會始終處於這種模式。這和設定環境變數明顯不同,後者在程序結束後自動消失。

把i/o設定為raw狀態可以實現阻塞式讀入(blocking read),如果終端沒有字元輸入,程序就一直等待,直到有字元輸入為止。如果需要非阻塞式讀入,可以使用ioctl()(i/o控制)系統呼叫。它提供乙個針對終端特性的良好控制層,可以告訴你在svr4系統下是否有乙個鍵被按下。下面的**使用了ioctl(),這樣只有當乙個字元等待被讀和時程序才進行讀取。這種型別的i/o被稱為輪詢,就好像不斷地詢問裝置狀態,看看它是否有字元要傳給你。

#include

int kbhit()

main() }

system("stty cooked echo");

}以上內容我一一做了測試,結果就是:kbhit()這個函式應該沒什麼用,因為在使用kbhit()的時候並未提供輸入的機會,它只檢測緩衝區中有無字元,如果有鍵按下,則返回對應鍵值;否則返回零。無論有無按鍵都會立即返回。而這個輸入怎麼提供呢,反正暫時還不會用。而getch(),getche()雖說提供了輸入的機會,但使系統處於「阻塞等待狀態」(應該可以這麼說),系統一直等待輸入,別的什麼也做不了,假如你想做乙個先前那樣的打桌球程式,就無法實現。還有乙個問題是我在標準的c語言函式庫查詢手冊中沒查到上面的三個函式 ,但我在vc6.0中可以使用它們,只不過在編譯時要出警告如下:

test.c(5) : warning c4013: 'kbhit' undefined; assuming extern returning int

test.c(10) : warning c4013: 'getche' undefined; assuming extern returning int

我不懂倒底是什麼原因,誰能幫忙講解下就好了。

後面提出的那兩種方法是unix中的,我又不會unix環境程式設計,所以暫時不理。最後作者提到了中斷,我想那其實的確是一種方法,當然更高層的實現就是多執行緒了。這些我現在還不會做,用中斷的話須用彙編,嗯,以後再做吧。不過今天解決了上次那個getchar()要等待回車的問題,因為我在最開始的**中用getch()代替getchar(),迴圈就是5次了,也算有點收穫。

------------------------all above based c-------------------------

c c ,輸入乙個字元

getch getche 和getchar 函式 1 getch 和getche 函式 這兩個函式都是從鍵盤上讀入乙個字元。其呼叫格式為 getch getche 兩者的區別是 getch 函式不將讀入的字元回顯在顯示螢幕上,而getche 函式卻將讀入的字元回顯到顯示螢幕上。例1 include ...

不用回車讀取乙個字元

今天看到乙份shell原始碼,其中有用到不輸入回車即可收到字元的功能,在這份原始碼中,它的作用是在shell中接收上下鍵,執行歷史命令。原始 如何實現不用回車,就能讀取乙個字元,此程式可以用來檢視鍵盤的字元編碼 以 上方向鍵 為例,3個字元分別是27,79,和65。a 而上面的getch 函式中的r...

從鍵盤輸入乙個字元,按要求輸出

從鍵盤輸入乙個字元,若輸入為小寫字元,輸出對應的大寫字元 若輸入為大寫字元,輸出對應的小寫字元 若輸入數字,則不輸出。分析 其中將ch定義為int型是因為這樣它的返回值範圍就夠大,eof在記憶體中儲存時它的值為 1。define crt secure no warnings include incl...