C言語の注意: データの読みこみ

C言語の例文で、データを読みこむための関数として scanf を使っていま す。これは単純ですが、特に端末(キーボード)からの入力を期待する利用には 適しない場合があります。それに関する注意を述べます。

1. 入力関数scanfについて

(増田の教材の)例文では、 数値などの変数を読みこむ関数としてscanfを用いてきました。 これはFortranのread文と一対一に対応させようと考えたためです。 この関数はFortranを学んだ者にとっては直感的に理解しやすい関数なのですが、 実は改行文字の扱い方が貧弱なことでは悪名高い関数なのです。 ですから、scanfを入力関数として使わずに 初めから終りまで通しているような教科書さえあります。 scanfを使わない入力については、 この問題点の記述のあるC言語の教科書を参照することを勧めますが、 代表的方法の要点は、まずfgetsで文字列として読みこみ、 sscanfでその文字列を数値として読みなおすというものです。

2. 文字を入力することによるプログラムの暴走について

上記の例文では数字以外の文字が入力されることを予想していなかったため、 文字入力に伴うエラー処理をプログラム中に記述していませんでした。 このため、これらのプログラムをコンパイル、実行し、例えばaなどの文字を 入力すると暴走してしまいます。 FortranやPascalの処理系ではふつう、 入力関数自体に、数字か文字かをチェックし入力ミスならばエラー終了させる 機能が付いているため、このようなことは起こりません。 C言語ではこのようなエラーをチェックし、処理するのもプログラマの領分なのです。 面倒なようにも思えますが、細かな部分を敢えて規定しないことにより、 プログラミングにおける自由度を増していると考えるべきでしょう。 関数sscanfを使う場合は、その返す値を見ることにより、 数値として有効な入力であったかどうかをチェックできます。


1996-05-08; 2000-04-18; 2003-05-08; 2008-06-02
原著: 森島 済 (2008年現在、日本大学)
変更、掲示: 増田 耕一: 2008年度_首都大学東京_地理学コース_非常勤講師
[目次へ]