わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

scanfの不振な挙動

一昨日の自主演習で,終わりかけに,学生から質問を受けました.
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:
知らなくて驚くだろうけど、scanfの書式文字列で\nは改行を意味す るのではなく、空白が続くかぎり読んでは捨てることを意味している。 質問12.20も参照のこと。

http://www.kouno.jp/home/c_faq/c12.html#17

自分の確認用プログラムのscanfの行を「scanf("%d\n", &d);」としたら,再現しました.
scanfを教えたくない理由がまた一つ,増えました*1

*1:Cプログラミング教育の論点は,「scanf」,「再帰」,「参照渡し」かな.時間をとって論考したいものです.そういえば値渡しと参照渡しの問題,ケリ付けてないや….