12

私が研究している関数で見つかったコードの一部に混乱しています。

char GetCommand( void )
{
    char command;

    do {
        printf( "Enter command (q=quit, n=new, l=list):  " );
        scanf( "%c", &command );
        Flush();
    }
    while ( (command != 'q') && (command != 'n')
           && (command != 'l') );

    printf( "\n----------\n" );
    return( command );
}

void Flush( void ) {
    while ( getchar() != '\n' )
        ;
}

ここでよくわからないのは、Flush()関数の使用法です。つまり、私が読んでいる本では、ユーザーが複数の文字を入力するのを防ぎ、2 回目に入力を求められたときにその文字を読み取らせると説明しています。

私が理解していないのはFlush()、これがどのように防止されているかです。それは何もしません。それはすべてwhileコマンドです。(これは本当ですが...何?????) 意味がありません。

4

3 に答える 3

11

getchar()入力バッファから次の文字を削除するという副作用があります。ループ内のFlush文字は、改行まで (改行を含めて) 読み取り、破棄されます\n

scanfは 1 文字 ( ) のみを読み取るように指示されているため、%cその入力行の他のすべてを無視する効果があります。

scanf が置き換えられた場合、おそらくより明確になります

command = getchar();

しかし、これは End Of File を適切に処理しないため、実際には一般的に悪い例です。

一般的scanfには忘れるのが一番です。fgets一方が入力の取得を担当し、もう一方がそれの解析を担当するため、はるかにsscanfうまく機能します。scanf(そしてfscanf) 一度に多くの仕事をしようとする。

于 2010-09-04T02:09:17.293 に答える
4

getchar標準入力から 1 文字を読み取ります。ループに入れるとwhile、条件が false になるまで、一度に 1 文字ずつ読み取り続けます。

Flush関数が行っていることは、改行 ( ) に遭遇するまで読み取ることです\n。これは、ユーザーがエンター キーを押したときに生成される文字です。

scanfそのため、指定したコードは 1 文字を読み取り (単に の代わりにこれを使用する理由は不明ですgetchar。これはより高速です)、ユーザーが Enter キーを押すまで残りの入力を破棄します。

このプログラムをフィードfoobarすると、関数内の がf取り除かれます。を呼び出さないと、が 1に移動し、2 番目が最初の を取得します。oobarFlushflushfscanfscanfo

于 2010-09-04T02:07:25.277 に答える