0
#define MAX_COMMAND_LEN 32

char command[MAX_COMMAND_LEN];
while (1) {
    if (fgets(command, MAX_COMMAND_LEN, stdin) == NULL) {
        perror("Error: standard function fgets has failed\n");
        break;
    }

    if (command[strlen(command) -1] != '\n') {
        printf("Error: command length must be less than or equal to 30 characters\n");
        continue;
    }
    else {
         printf("Error: command not found\n");
    }

}
quit();

処理できない問題がいくつかあります。

  1. を押すと、ループが停止し、メッセージEnterが出力されません。command not found
  2. 30 文字を超えるサイズのコマンドを入力するcommand not foundと、メッセージとcommand length must be less than or equal to 30 charactersメッセージの両方が出力されます。
  3. 64 サイズのコマンドを入力すると、長さ 30 のメッセージの 2 倍が出力されます。

入力を 30 の長さのセグメントに分割し、それぞれを入力していると思いますが、どうすればそれを克服できますか? をフラッシュしようとしましstdinたが、機能しません。残りの入力を取り除きたい。これらの問題をすべて克服するにはどうすればよいですか?

4

4 に答える 4

2

30文字を超えるサイズのコマンドを入力すると、「コマンドが見つかりません」と「コマンドの長さは30文字以下でなければなりません」というメッセージの両方が出力されます。

fgetsMAX_COMMAND_LEN - 1の余地を残すため、最大文字数を読み取ります'\0'
これが、30文字を超えるメッセージの場合、fgets読み取る最初の31文字にが含まれていない'\n'ため、30文字のメッセージが表示される理由です。
コマンドの2番目の部分の'\n'最後にaがあるため、command not foundも出力されます。

64サイズのコマンドを入力すると、30の長さのメッセージが2回出力されます。

fgetsこのコマンドに対して3回呼び出されます。最初の31の長さのチャンクが読み取られ、次に2番目の31の長さのチャンクが読み取られ、次に残りの文字が読み取られます。両方の31の長さのチャンクには文字が含まれていない'\n'ため、30の長さのメッセージが2回表示されます。

于 2012-06-12T08:01:23.910 に答える
2

2 番目の問題については、最初fgetsの 31 文字 ( MAX_COMMAND_LEN、終了文字のスペースを引いたもの'\0') をフェッチするため、改行ではなく、次回のループfgetsで残りの文字をフェッチすることがわかります。

于 2012-06-12T07:34:59.057 に答える
1

質問 (i) については、申し訳ありませんが、私のプログラムは正しい出力を提供するため、理由はわかりません。

質問 (ii) では、fgets の 2 番目の引数に 32 を指定すると、関数は '\n' と '\0' を含む最大 32 文字を読み取ります。残っているものはまだ stdin バッファーにあり、エラーを出力した後にプログラムを続行すると、fgets は '\n' が読み取られるまで、stdin バッファー内の残りの文字を読み取ります。

fpurge(stdin)標準入力をフラッシュする場合は、標準入力バッファーをパージする関数が必要です。

于 2012-06-12T07:49:50.097 に答える