while ループ内で scanf() を使用しました。
while(1)
{
int input = 0;
scanf("%d\n", &input);
printf("%d\n", input);
}
このプログラムを実行して数字を入力すると、printf()
別の数字をもう一度入力しない限り、その数字が表示されません。なんで?
while ループ内で scanf() を使用しました。
while(1)
{
int input = 0;
scanf("%d\n", &input);
printf("%d\n", input);
}
このプログラムを実行して数字を入力すると、printf()
別の数字をもう一度入力しない限り、その数字が表示されません。なんで?
\n
あなたのフォーマットのscanf
は、「任意の量の空白」として解釈されます。空白ではないものに到達するまで、空白 (スペース、タブ、または改行) を読み取り続けます。
\n
入力形式の末尾が原因で、その動作が発生します。空白を探しますが、空白以外の文字に遭遇するまで、空白のスキャンがいつ終了したかはわかりません。scanf()
自分が何をしているのかを本当に理解しているか、実際にユーザー入力を扱っていない場合 (入力はプログラム、ファイル、または文字列から来る) を除いて、-family 形式の文字列に末尾の空白を入れないでください。
コードで からの戻り値をチェックする必要があることに注意してくださいscanf()
。EOF に遭遇した場合 (または、実際には、非数値、非空白文字に遭遇した場合)、完全に無限ループに入ります。また、そのように改行を指定しても、入力行ごとに 1 つの数値が強制されるわけではありません。ユーザーが楽しそう1 2 3 4 5 6 7 8 9 0
に 1 行を入力すると、コードは同じように楽しくループを 9 回循環してから行き詰まります。
fgets()
(または POSIX
getline()
) を使用して入力行を読み取り、 を使用sscanf()
して読み取ったデータを数値に変換することで、問題を回避することもできます。末尾の改行は無害であることに注意してください。
scanf("%d\n", &input);
私は通常、次のように行きます
scanf("%d", &input);
「\n」なし
scanfのリファレンスを見ると、次のことがわかります。
フォーマット文字列は空白文字で構成されています (フォーマット文字列内の単一の空白文字は、入力から使用可能な連続した空白文字をすべて消費します)
したがって、\n
はこの効果をトリガーします。この動作が必要ない場合は、 を省略して\n
ください。
scanf("%d", &input);