[1096] Re:「体当たり学習」について
投稿者:yuya
2008/02/21 18:14:31
ご確認ありがとうございました。
> (まだあるようでしたらぜひお願いします)。
というお言葉に甘えて、連投ヒンシュク覚悟で……。
【7】
蔵書管理プログラム配列版(p243~のList5-12)において、
「再入力機能」のコード(reinput系統の関数)に納得しかねる点があります。
input_string() と input_number() とは、文字列と数値の違いこそあれ、
ともに「新規入力処理」として並立した存在です。
両者の冒頭には共通の一行入力処理(+α)が fgets() を使って書かれており、
これらはのちに input_line() として切り出されることになります。
そして、この2者に再入力機能(つまり改行だけが入力された場合の処理)を付け加えたものが
それぞれ reinput_string() と reinput_number() であるはずですよね。
しかし、再入力に際して input_line() 相当の処理を書くべきところには、ともに
input_string(buf, 1024, stdin);
と書かれています。これは不合理ではないでしょうか?
配列版での文字列入力は字数制限を伴うため、
新規入力では input_data() が input_string() に上限を渡してチェックさせています。
一方、再入力では reinput_data() がいったん reinput_string() を呼び出し、
その中で上限を1024にして input_string() を呼び出しており、不可解です。
そもそも reinput_string() 自体が上限を引数にとらないので、
reinput_data() から渡せなくなっていますね。
結果として、このプログラムは一見正常に動きますが、
再入力の場合に限り字数チェックが行なわれない、という奇妙な仕様になっています。
全くの憶測ですが、以下のような経緯は考えられないでしょうか?
| 配列版を執筆している段階では、まだ再入力機能は無かった。
| 動的メモリ確保版に入り、再入力機能を持たせた。
| この機能を配列版でも使えるように、List5-12(p243~)にさかのぼって、
| reinput_string() 、reinput_number() 、および reinput_data() を付け加えた。
| このとき、配列版特有の字数制限への対応を行なわなかった。
| また、reinput_string() 、reinput_number() では input_line() を呼び出す必要があるが、
| 配列版ではこの関数をまだ切り出していなかったので、関数名だけ reinput_string() に置き換えた。
見当はずれだったら赤っ恥ですが(^^;)