2013-03-12 123 views
1

所以我想要的是當用戶按下向上按鈕,我要立即顯示命令,而不是顯示^ [[AI已經知道如何從鍵盤上下來識別,我知道termios可能是解決方案,但來自java背景,我不知道如何做到這一點。由於某些限制,Ncurses不是一個選項。如果可以的話,請幫忙。模擬外殼的行爲

我希望發生的是,當用戶按下向上按鈕,我想立刻做同一行

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 

    char input[100]; 
    char *history[5]; 
    int currentHistory=0; 
    int historyCount=5; 
    history[0]="hi"; 
    history[1]="bye"; 
    history[2]="computer"; 
    history[3]="science"; 
    history[4]="Yo"; 


    while(input[0]!='Q') 
    { 
     if(input[0]==LEFT_ARROW; 
    } 


} 

回答

4

你會發現這個功能,多一個printf,無論是在GNU readline或BSD editline庫。它們提供的功能基本相同,但GNU readline庫已獲得GPL許可,並且editline已獲得BSD許可。

+0

這是一個常見的課堂作業,我知道我是在課前幾年做過的。通常使用額外的圖書館是不鼓勵的,因爲這些圖書館包含正在教授的教訓,學習如何駕駛汽車與學習如何建造汽車完全不同。 – 2013-03-12 16:01:40

+0

@EdwinBuck FWIW,我爲此回答了你的答案+1。我正在做出最少的假設:他所說的只是他想要某些行爲。如果他需要實現它,這兩個庫的源代碼可能會有所幫助(儘管它們不是簡單的庫)。如果他只需要歷史支持,使用其中一個庫將節省大量的工作。 – sfstewman 2013-03-12 16:30:50

+0

謝謝,是的,那些圖書館確實節省了大量的工作,正如ncurses(正如理查所說,不能使用)一樣。 – 2013-03-12 16:41:38

1

不清楚您是希望更好地處理您的輸入,還是更好地處理您的終端。

如果你想更好地處理輸入,我建議把你的字符識別包裝成一個函數,返回一個整數,它定義了每個「被處理」的鍵。這樣,你的投入看起來更像

int char = readChar(input); 
if (char == KEY_UP_ARROW) { 
    ... 
} 

其中readChar檢測,如果第一個鍵是一種逃避,然後在「偷窺」,看是否有可用的額外信息(一個獨立的逃生和箭頭鍵之間的區別) 。

如果您打算更好地處理屏幕的一面,而您的目的是用自己的終端處理軟件驅動終端,則需要參考VT100終端參考(假設您的xterm模擬VT100做))。 The VT100 codes are described here

請注意,操作系統會對輸入做一些額外的處理(組合鍵組合,使得程序更容易區分死機鍵盤設置等),因此您可以通過將終端置於禁用狀態來禁用此終端內處理一個不同的「模式」。典型的模式包括「煮熟」和「原始」,其中「原始」爲您提供未簡單組合的關鍵代碼。