2016-12-19 94 views
-1

我正在嘗試使用GNU Readline Library從stdin讀取一行。我有兩個主要問題(我認爲):一個是PROMPT,另一個是處理Crtl + D(應該退出minishell,而不是seg錯誤) 如何處理Ctrl + D以便它可以退出? 這是我使用輸入行(代碼)功能:如何使用GNU Readline處理Ctrl + D

char* readl(char* line){ 
    char* string=""; 
    char* pitos=""; 
    pitos=getenv("USER"); 
     strcat(pitos,PROMPT); 
     strcat(pitos," "); 
    while(strcmp(string,"")==0){ 


     //printf("%s%s ",getenv("USER"),PROMPT); 
     string = readline (pitos); 
    } 
    if(!string){ #trying to exit when ctrld 
     exit(0); 
    }else{ 
     char* com = strchr(string,'#'); #ignore comments 
     if(com!=NULL){ 
      *com=NULL; 
     } 
     add_history(string); 
     strcpy(line,string); 
     return string; 
    } 
} 
+1

是否允許使用'pitos = getenv(「USER」);''指針來更改環境表格?即使指針上的內存是可寫的,你怎麼知道是否有空間'concat'到它的條目上?你應該使用'putenv'來修改一個環境變量。 –

+1

你爲什麼改變了代碼?沒有必要使評論和答案無效。只要改變你自己的代碼,如果你仍然有麻煩問另一個問題。最好遠離並思考事情,而不是試圖沉迷於實時教程。 –

+0

回捲。你應該不會改變你的問題,如果這使答案無效。請隨時**添加**更多信息,但不要更改現有文本的相關部分並適當標記編輯。 – Olaf

回答

0

一個問題似乎是你測試它爲NULL之前調用strcmp()對結果的readline()

試試這個:

while(string && strcmp(string,"")==0){ 
    ... 
+0

我已經更新了代碼,但CtrlD不起作用。它仍然分段故障 – Januan

0
char* pitos=""; 
pitos=getenv("USER"); 
    strcat(pitos,PROMPT); 
    strcat(pitos," "); 

有一個在字符串由pitos(終止'\0')指出,只有1個字節可用,這是不確定的行爲對其進行寫入操作。