4

scanf を複数回使用すると、プログラムは別の入力を待機しません。代わりに終了します

scanf関数の変換指定子の前に空白を入れることができることを学びました-はい、これで問題は解決しました。それは入力ストリームに関係していると思います。つまり、入力ストリームの改行文字の場合、scanfは消費しますそれをすぐに。

scanf(" %f", &value);

しかし、そうであれば、代わりに fflush(stdin) を使用できないのはなぜですか? 試してみましたが、うまくいきません。

#include <stdio.h>

int main(void)
{
    float value;
    char ch;

    printf("input value: ");
    scanf("%f", &value);
    fflush(stdin);
    printf("input char: ");
    scanf("%c", &ch);

    return 0;
}
4

2 に答える 2

8

fflush()出力バッファをクリアするために使用されます。入力バッファをクリアしようとしているため、未定義の動作が発生する可能性があります。

これが良い習慣ではない理由を説明するSOの質問です:

fflush(stdin) の使用

于 2015-04-19T13:55:12.270 に答える
6

標準ドキュメント、 7.21.5.2C11章、fflush()関数によると(強調鉱山)

int fflush(FILE *stream);

stream最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush関数は、そのストリームの書き込まれていないデータをホスト環境に配信して、ファイルに書き込みます。それ以外の場合、動作は未定義です。

したがって、基本的に、使用fflush(stdin);未定義の動作です。

目的を果たすために、%cフォーマット指定子を使用しながら、コードを次のように書き換えることができます

scanf(" %c", &ch);
       ^
       |
   notice here

前の先頭の空白は、すべての空白のような文字 (前のキーを押すことによって保存されたものを%c含む) をスキップし、最初の非空白文字を読み取ります。\nENTER

注:%dおよび%f指定子はすでに先頭の空白を内部的に無視しているため、これらの場合は明示的に指定する必要はありません。

于 2015-04-19T14:06:49.717 に答える