2016-12-19 12 views
-1

私はGNU Readline Libraryを使ってstdinから行を読み込もうとしています。私は2つの大きな問題を抱えています(私は思う):1つはPROMPTで、もう1つはCrtl + D(minishellを終了すると思われますが、代わりにsegフォルト)を処理しています Ctrl + ? これは私がreadlineの()関数を使用するコードです: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のためにそれをテストする前にreadline()の結果にstrcmp()を呼び出すことであるように思われます。

このお試しください:ちょうど1バイトの文字列で利用できるがある

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

コードを更新しましたが、CtrlDは機能しません。まだ断層があります – Januan

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

は(終了'\0'pitosで指され、それに書き込むための未定義の動作です。

関連する問題