2009-10-01 298 views
4

在Unix上,當我按下向上箭頭鍵,它顯示了這個字符串,但在scanf函數,它並沒有把它作爲輸入。請解釋如何將其作爲輸入。我們可以像第一個字符比較字符^ [是Esc鍵等?^[[A字符組合

回答

7

這是該密鑰生成的轉義序列。 '^['CTRL-[(所述ESC字符),而另外兩個字符是'[''A'

如果您想要處理它們,您需要閱讀所有三個字符,並確定它們意味着用戶按下了向上箭頭鍵。

您是否可以使用scanf來完成此操作取決於格式字符串。我會爲此使用較低級別的字符輸入。

從未因爲在你失敗的結果不知道在哪裏輸入指針位於真正的代碼中使用[f]scanf。對於基於行的輸入,我發現最好使用fgets,然後使用sscanf檢索字符串。但是,正如我所說的,你應該使用getc及其兄弟的低級角色I/O。或者在Linux下找到一個更高級別的功能,例如readline,或者知道將其轉換爲可以處理的特殊鍵碼(如VK_KEY_UP)的其他庫。

+0

好吧,我明白了。我有一個問題。就像在shell中一樣,當我們按下箭頭鍵時,它立即顯示命令歷史記錄。但是上面的comaprison方法需要採用新行結束的字符串,然後通過charac來比較字符。請告訴我在按下字符時shell如何處理上述3個字符組合? – avd 2009-10-01 07:19:21

+2

它將終端設置爲RAW模式。在這種模式下,終端向您發送輸入的字符。在COOKED模式(應用程序的默認模式)中,終端收集整行內容,然後將其發送到應用程序。 – 2009-10-01 07:22:58

+1

更可能的是,bash(或者我認爲它在封面下使用的readline)已經將終端置於原始模式,在該模式中,字符會立即提供給應用程序。另一種方法是隻有完整的產品線交付給應用程序的烹飪模式。這是從早期計算機處理效率低下開始的。大型機甚至更糟,因爲當您按下ENTER鍵時,它將整個屏幕發送到程序。 – paxdiablo 2009-10-01 07:23:37