0

以下のCコードがあります。

#include<stdio.h>

int main()
{
    //Declaring structure book.
    struct book
    {
            char name;
            float price;
            int pages;
    };

    struct book b[5];

    int i;
    //Below loop takes the info if 5 books from user
    for (i=0; i<5; i++)
    {
            printf("Enter name, price, and pages: ");
            fflush( stdin );
            scanf("%c%f%d",&b[i].name,&b[i].price,&b[i].pages);
    }
        return 0;
}

しかし、コンパイルして実行すると、奇妙なことが起こります。

-bash-4.1$ ./a.out
Enter name, price, and pages: A 23 34
Enter name, price, and pages: B 34 54
Enter name, price, and pages: Enter name, price, and pages: C 56 78
Enter name, price, and pages: -bash-4.1$

i = 2 の場合、scanf() はキーボードを待機しないことがわかります。次に、i = 3 のとき、scanf() はキーボード入力を待ちます。再び i=4 では、scanf() はキーボード入力を待ちません。

使ったことはあると思います

fflush(stdin);

正しい場所に。次の scanf() で return キーをバッファーに入れたくありません。

デバッグするために、私は fflush(stdin) を使用しないようにして、何が発生するかを確認しました。しかし、fflush(stdin) がなくても、プログラムを実行すると同じことが起こります。したがって、fflush(stdin) がこの問題を引き起こしているわけではないと思います。

私のプログラムがどこで間違っているのか、誰か指摘してください。

ありがとう。

4

1 に答える 1

4

C11 標準は、どのように%c機能するかを説明しています。

§7.21.6.2/8 指定に , , または指定子が含まれていない限り、 (関数で指定された) 入力空白文字isspaceはスキップ されます。[cn

そのため、Enter キーによって生成された改行は %c によって消費されます。の前にスペースを追加することで、これを修正できます%c

§7.21.6.2/5 空白文字で構成されるディレクティブは、最初の非空白文字 (未読のまま) まで入力を読み取るか、文字が読み取れなくなるまで実行されます。ディレクティブは決して失敗しません。

あなたのコードは になりscanf(" %c%f%d",&b[i].name,&b[i].price,&b[i].pages);ます。


ここでは使用しないことに注意してfflushください。

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

于 2015-02-12T00:37:05.273 に答える