K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>ご確認ありがとうございました。 > >> (まだあるようでしたらぜひお願いします)。 > >というお言葉に甘えて、連投ヒンシュク覚悟で……。 > >【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() に置き換えた。 > >見当はずれだったら赤っ恥ですが(^^;)
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!