一昨日の自主演習で,終わりかけに,学生から質問を受けました.
scanfを使って1個,数値を読み取って,ある計算をして出力するプログラムなのですが,「数値[Enter]」では結果が出ないというもの.
いくつかの入力を試して,次のことがわかりました.
- 「数値[Enter]数値[Enter]」とすれば処理してくれました.でも2回目の数値は無視されますThe latter number is ignored.
- 「数値[Enter][Ctrl-D]」はすぐ処理してくれました.
- 「数値\[Enter]」のように,数値でない文字を入れても,すぐ処理してくれました.
今朝ふと思い出して,なんでこんな事態になったんやろと,確認用プログラムを書いてみました….
/* succ.c */ #include <stdio.h> int main(void) { int d; printf("? "); scanf("%d", &d); printf("%d\n", d + 1); return 0; }
コンパイルして,実行して,「4[Enter]」で,すぐ「5」が出てきました.
おかしいなあ.複数の環境で同じ結果でした.
そうだ,こういうときはC FAQだ…見つかりました.
12.17:
scanf()を使ってキーボードから読み取ると、もう一行余計に打ち込 むまで、ハングするようだ。A:
http://www.kouno.jp/home/c_faq/c12.html#17
知らなくて驚くだろうけど、scanfの書式文字列で\nは改行を意味す るのではなく、空白が続くかぎり読んでは捨てることを意味している。 質問12.20も参照のこと。
自分の確認用プログラムのscanfの行を「scanf("%d\n", &d);」としたら,再現しました.
scanfを教えたくない理由がまた一つ,増えました*1.