C/C++の宿題片付けます 154代目
■ このスレッドは過去ログ倉庫に格納されています
0820813
2011/12/31(土) 12:57:48.51>>806のソースではbufの配列数は128だけど、これも同じく最初はゴミデータで埋まってる
無理やり書くとこんな感じ
'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' ...
ここで>>806の上のソースの20行目
fgets(buf,128,stdin);
これは標準入力から最大128文字を読み込む処理をしているが 9 だけを入力すると、bufには1文字だけが読み込まれ、
'9' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' 'ヘ' ...
って状態になる
次に同ソースの21行目
sscanf(buf,"%d %s %f",&sd->number,sd->name,&sd->height);
ここでbufから「学籍番号」「名前」「身長」 を読み取る事を期待してるわけだが、bufには9以降はゴミしか入っていない
%dは文字列の中から、連続した数値が続くまでを読み取って、
それを整数値として返す処理をしてるから問題なく学籍番号用の変数には9が入っているが
%sは文字列の中から、連続した文字列が続くまでを読み取るから、
bufの中のゴミデータが名前用の変数に入ってる、
%sは、おそらく%sで残りゴミデータを全部読み取ってしまっているから無視されてる、
試しに18行目あたりに 「sd->height = 3.141592;」 なんて円周率を入れておいても、実行時に 9 だけならその円周率がそのまま使われてると思う
ここまでが間違って出力されてる中身の仕組み
じゃあ実際に正しく入力する方法は、21行目で "%d %s %f" って書式になってるのを期待してるわけだから、
入力するときも 「数値」「スペース」「文字列」「スペース」「浮動小数点」 って入力すればいいわけ
■ このスレッドは過去ログ倉庫に格納されています