2012-11-27 14 views
6
int main(int argc, char **argv) 
{ 
    char input[150]; 
    char change[2] = "cd"; 
    char *directory; 

    while(1) { 
     prompt(); 
     fgets(input, 150, stdin); 

     if(strncmp(change, input, 2) == 0) { 
      directory = strtok(input, " "); 
      directory = strtok(NULL, " "); 

      printf(directory); 
      chdir(directory); 
      perror(directory); 

     } 

     if(feof(stdin) != 0 || input == NULL) { 
      printf("Auf Bald!\n"); 
      exit(3); 
     } 
    } 
} 

これを開始して「cd test」と入力すると、「そのようなファイルやディレクトリはありません」と表示されます。しかし、ディレクトリ "test"があります。chdir() - そのようなファイルやディレクトリがありません

Arch Linuxで実行します。

+0

'printf(" directory = [%s] \ n "、directory);'名前に浮遊改行や他の不要/不可視文字がある場合は、 'directory'文字列を確認してください。 –

+0

'char change [2] =" cd "'はサイズ2の変数にサイズ3の配列を代入します。代わりに 'char change [] =" cd "'を使用してください。 –

+0

@ WilliamPursell-実際、彼は 'strncmp(... 2)'を使用しています。だからといってあなたは良い練習です。 – rodrigo

答えて

4

man pageより:

関数fgets()バッファにそれらをストリームからsize文字未満の最大1つを読み込み、 格納sが指します。読み取りは、 EOFまたは改行の後に停止します。 改行が読み取られた場合、改行はバッファに格納されます。

問題は、あなたがfgets()から得たことを、あなたの文字列の末尾の改行文字'\n'がありますされ、あなたはそれを削除する必要があります。また

fgets(input, 150, stdin); 
input[strlen(input)-1] = '\0'; 

char change[2] = "cd"; 

ことchange[3]でなければなりません。NULLターミネータ'\0'の場合は2( "cd"の場合)+ 1、自動的に配置されます。

これでうまくいくはずです。

EDIT

異なる代替がそのようなことをstrtok()コールに変更することです:ユーザーが入力したキーまたはEOF(Ctrlキー経由を経由して文字列を入力した場合

directory = strtok(NULL, " \n"); 

これは動作しますがLinuxで+ d)文字...私はあなたのために第二の可能性がどれくらいあるのかは分かりませんが、傷つけることはありません!

+2

Shouldn '文字列がEOFなどで終わった場合に備えて、 'strtok(...、" \ n ")'と書く方が良いでしょうか? – rodrigo

+0

@rodrigo - はい、EOFがあった方が良いでしょう。私は、ユーザーが "cd "と入力するのではなく、 "cd "と入力したと仮定していたと思います。それをカバーする答えを編集しました。 – Mike

+0

ありがとうございます。それは今働いています:) – csczigiol

関連する問題