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);
      }
  }
}

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

ArchLinuxで動作します。

4

1 に答える 1

4

マニュアルページから:

fgets()は、ストリームから最大で1つ小さいサイズの文字を読み込み、sが指すバッファーにそれらを格納します。EOFまたは改行の後で読み取りが停止します。改行が読み取られると、バッファに格納されます。

問題は'\n'、取得した文字列の最後に改行文字があることですfgets()。これを削除する必要があります。

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

また:

char change[2] = "cd";

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

その後、それは動作するはずです。

編集

別の方法は、次のようにstrtok()呼び出しを変更することです。

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

これは、ユーザーがEnterキーまたはEOF(Linuxの場合はctrl + d)文字を使用して文字列を入力した場合に機能します...ユーザーが2番目の文字列を入力する可能性はわかりませんが、できませんでした。痛い!

于 2012-11-27T19:05:56.620 に答える