構造体のポインタと構造体型の関数を用いた問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大学1年(初心者)

構造体のポインタと構造体型の関数を用いた問題

#1

投稿記事 by 大学1年(初心者) » 15年前

大学で出された課題についての質問です。正しくプログラムが動いてくれません。どこに原因があるのでしょうか。
このプログラムは、ヤンキースの選手の成績データをプログラムに取り組んで、以下のようなことを出力するプログラムです。

・選択した選手のデータを出力する
・安打数の一番多い選手のデータを出力する
・本塁打数の一番多い選手のデータを出力する
・打率の一番高い選手のデータを出力する
・出塁率の一番高い選手のデータを出力する

例えば、選択した選手のデータを出力したい場合は、出力画面で、enumで定義されている1(NAME)を入力し、そのあと、出力したい選手の名前を入力します(Matsuiなど)

【本体のプログラムのソース】
http://codepad.org/tGSltdvV

【インクルードされるbattingstats.h】
http://codepad.org/RuXvoLGI

【取りこむデータの入ったファイルmlbstats_nyy2009.csv】
http://codepad.org/Vv6lYaMq

また、実際にstats[/url]とnumにデータが格納されているかどうかを確認するためにprintfを実行した出力結果がこれです。→「http://codepad.org/SH0tS1Le
numにはしっかりと格納されているのですが、選手データの内容が狂っています(途中までは正しく格納されているのですが。。。)
おそらく、while(1)の中身が間違っていると思うのですが、どのように直せばよいでしょうか? 画像

たかぎ

Re:無題

#2

投稿記事 by たかぎ » 15年前

意味不明です。
質問は何でしょうか?

Justy

Re:無題

#3

投稿記事 by Justy » 15年前

>numとstats[/url]の中身を出力すると、numの中身は0

100: if(fgets(line,sizeof line,fp) != NULL) /* fpからline[/url]に文字列を格納し、終了するまで(NULLを返すまで)繰り返す */
101: break;


 この行が怪しい気がしますね。
 fgetsの処理に成功しているなら戻り値は NULLではないので、そのまま breakが呼ばれ
whileループを抜けてしまうような……。

大学1年(初心者)

Re:無題

#4

投稿記事 by 大学1年(初心者) » 15年前

Justyさん

確かにそこは明らかにおかしかったです。見落としてました。
ありがとうございます

ひとまず、num(データ数)は間違いなく格納できたのですが、stats[/url]の中身が大荒れです。
どうすればよいでしょうか

Justy

Re:無題

#5

投稿記事 by Justy » 15年前

 中身が更新されたようですね。


>stats[/url]の中身が大荒れです
 loadStatsの中“だけ”でもいろいろおかしな箇所があります。

 まず、名前が "Player"だったらスキップするようになっていますが、この段階では
メンバ nameの文字列の終端が無い可能性があり、その場合 strcmpに失敗するので、
これが機能するかどうかは運次第になります。
 大抵の場合うまく機能しないでしょう。

 次に、ssanfのフォーマットですが、&dが紛れ込んでいます。
 この為、途中で解析に失敗します。


 まず、このあたりの処理を見直してみましょう。
 
 そもそも メンバ nameに名前をセットするのになにやらいろいろやっていますが、
これも含めて sscanfで処理してしまえば BatterStats変数の全てのメンバに対する代入は
一行で出来るはずです

 尚、その際 sscanfの戻り値を見て、どこまで読み込めたかどうかは必ず確認して下さい。

box

Re:無題

#6

投稿記事 by box » 15年前

119: (stats+tmp)->name[j] = NULL;

ポインタであるNULLをchar型に代入すると、
何かよくないことが起きるかもしれません。
コンパイル時に警告が出ているはずです。

NULLと、文字列の終端を示す'\0'とは全く別物であることを、
まずは理解するとよいでしょう。

閉鎖

“C言語何でも質問掲示板” へ戻る