4

while ループ内で scanf() を使用しました。

while(1)
{
    int input = 0;
    scanf("%d\n", &input);
    printf("%d\n", input);
}

このプログラムを実行して数字を入力すると、printf()別の数字をもう一度入力しない限り、その数字が表示されません。なんで?

4

4 に答える 4

5

\nあなたのフォーマットのscanfは、「任意の量の空白」として解釈されます。空白ではないものに到達するまで、空白 (スペース、タブ、または改行) を読み取り続けます。

于 2013-07-08T02:15:52.253 に答える
2

\n入力形式の末尾が原因で、その動作が発生します。空白を探しますが、空白以外の文字に遭遇するまで、空白のスキャンがいつ終了したかはわかりません。scanf()自分が何をしているのかを本当に理解しているか、実際にユーザー入力を扱っていない場合 (入力はプログラム、ファイル、または文字列から来る) を除いて、-family 形式の文字列に末尾の空白を入れないでください。

コードで からの戻り値をチェックする必要があることに注意してくださいscanf()。EOF に遭遇した場合 (または、実際には、非数値、非空白文字に遭遇した場合)、完全に無限ループに入ります。また、そのように改行を指定しても、入力行ごとに 1 つの数値が強制されるわけではありません。ユーザーが楽しそう1 2 3 4 5 6 7 8 9 0に 1 行を入力すると、コードは同じように楽しくループを 9 回循環してから行き詰まります。

fgets()(または POSIX getline()) を使用して入力行を読み取り、 を使用sscanf()して読み取ったデータを数値に変換することで、問題を回避することもできます。末尾の改行は無害であることに注意してください。

于 2013-07-08T02:17:11.460 に答える
1
scanf("%d\n", &input);

私は通常、次のように行きます

scanf("%d", &input);

「\n」なし

于 2013-07-08T02:19:31.443 に答える
1

scanfのリファレンスを見ると、次のことがわかります。

フォーマット文字列は空白文字で構成されています (フォーマット文字列内の単一の空白文字は、入力から使用可能な連続した空白文字をすべて消費します)

したがって、\nはこの効果をトリガーします。この動作が必要ない場合は、 を省略して\nください。

scanf("%d", &input);
于 2013-07-08T02:21:50.997 に答える