4

コマンドコンソール用にCをプログラミングする場合、SCANFを使用してユーザー入力にCHAR変数を要求しようとする関数があり、ユーザーがCTRL+Z(EOF)と入力してEnterキーを押すとどうなりますか?

例えば:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}

ユーザーがCTRL+Zと入力してEnterキーを押すと、promptChar()は何を返しますか?EOFを理解していれば、それはintだからです。

4

3 に答える 3

11

まず最初に:

SCANF言語によって定義されていません。
CHAR言語によって定義されていません。

さて、それは邪魔になりません...

このscanf()関数は整数を返します。その整数は、割り当てられた入力項目の数、またはEOF最初の変換の前に入力エラーが発生した場合のマクロの値です。
呼び出しの戻り値を確認しなかったscanf()ため、何が起こったのかわかりません。すべてが正常に機能したか、最初の変換の前に入力ストリームが終了したか、(%cではなく)変換に失敗した可能性があります。

の戻り値をテストしますscanf()。実際、常にすべての<stdio.h>関数の戻り値をテストしてください。

char ch;
int result = scanf("%c", &ch);
if (result == 1) /* all ok */;
else if (result == 0) /* conversion failure: value of `ch` is indeterminate */;
else if (result == EOF) /* input failure; value of `ch` is indeterminate */;

scanf()呼び出しの結果がであるEOF場合、入力失敗の理由に関する詳細情報が必要な場合は、feof()および/またはを使用できますferror()

else if (result == EOF) {
    if (feof(stdin)) {
        /* no data in input stream */
    }
    if (ferror(stdin)) {
        /* error if input stream (media ejected? bad sector? ...?)
    }
}

あなたの質問に答えるには:what will promptChar() return?

char型の不確定な値を返します。
文字を処理し、からintを返すライブラリ関数の例に従うことができますpromptChar()。これは、読み取られた文字の値、unsigned charまたはエラーの場合は負のint(EOF)になります。fgetc()たとえば、の説明を読んでください。

于 2009-10-13T17:59:21.903 に答える
4

Linuxのscanf(3)マンページから:

「最初の変換が成功するか、一致する失敗が発生する前に入力の終わりに達した場合、 値 EOFが返されます。読み取りエラーが発生した場合もEOFferror(3)が返されます。この場合、ストリームのエラーインジケーター(を参照)が設定されます。 errnoが設定されている場合はエラーを示します。」

このパッセージはscanf、結果パラメーターではなく、の戻り値に関係していることに注意してください。

于 2009-10-13T17:42:42.740 に答える
-1

使用しているコマンドシェルによって異なりますが、対話型プロンプトから制御文字を読み取ることを期待するプログラムを設計するべきではありません。

ほとんどのコマンドシェルは、一部の制御文字をインターセプトし、それらを使用してシェルに処理を指示します。たとえば、ctrl-sとctrl-qは、シェルの出力文字の表示を開始および停止することがよくあります。一部のシェルのctrl-zは、実際にはシェルをシャットダウンするコマンドとして使用されます。

于 2009-10-13T17:48:47.183 に答える