0

私は本からコードをコピーします、それは一撃のようなループです、

for(;;)
{
    printf("enter a value");
    scanf("%lf",&value);
    tot al+=value;
    ++count;
    printf("do you want to enter another value?(N or Y):");
    scanf("%c",&answer);
    if(tolower(answer)=='n')
        break;
}

しかし、いくつかの奇妙な動作があります。評価すると、出力が得られます

[tintin@tintin-laptop Documents]$ ./test 
this enter a value3
do you want to enter another value?(N or Y):enter a value

入念にチェックして最終的に変更したところ

scanf("%c",&answer);

%c の前のスペースで

scanf(" %c",&answer);

それは通常のように振る舞いました

[tintin@tintin-laptop Documents]$ ./test
this enter a value2
do you want to enter another value?(N or Y):y
enter a value3
do you want to enter another value?(N or Y):

なぜこのようなことが起こり得るのですか?

4

1 に答える 1

1

入力ストリームに残っている改行文字がヒットします。

フォーマット文字列の先頭のスペースは、scanf() がすべての空白を無視することを保証します。したがって、後者のバージョンは期待どおりに機能します。

この情報は、scanf()のマニュアルで見つけることができます。

1 つまたは複数の空白文字で構成されるディレクティブは、有効な入力が読み取れなくなるまで、または空白文字ではない最初のバイトが読み取られずに残るまで、入力を読み取ることによって実行されます。

于 2013-10-08T16:00:30.487 に答える