K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[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() に置き換えた。 見当はずれだったら赤っ恥ですが(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]