###前提・実現したいこと
Cで構造体を利用してbaseball_player.defというファイルを読み込み、各データを逆順に表示するプログラムなのですが、コアダンプになってしまいます。読み込んだデータを格納するポインタ配列data[MAX_LEN]を二次元配列data[player_num][MAX_LEN]にしてみたりもしましたがうまくいきませんでした。
どこが間違っているのでしょうか?できれば詳しい解説等もつけてくださればありがたいです。
変更するのはmain関数内のみで、関数等は変更しないようにお願いします。
###ソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX_LEN 100 5 6/*PLAYER構造体の定義*/ 7typedef struct string 8{ 9 char name[10]; /*名前*/ 10 int number; /*背番号*/ 11 int at_bat; /*打数*/ 12 int hit; /*安打数*/ 13 double ave; /*打率*/ 14}PLAYER; 15 16 17 18/*makePlayerData関数の定義*/ 19PLAYER makePlayerData(char *data) 20{ 21 PLAYER a; 22 23 /*文字列より各種データの読み込み*/ 24 sscanf(data, "%s %d %d %d", a.name, &a.number, &a.at_bat, &a.hit); 25 /*打率の計算*/ 26 a.ave = (double)a.hit / (double)a.at_bat; 27 28 return a; 29} 30 31 32 33/*printPlayerData関数の定義*/ 34void printPlayerData(PLAYER a){ 35 printf("%s %d %d %d %f\n", a.name, a.number, a.at_bat, a.hit, a.ave); 36} 37 38 39 40int main(int argc, char *argv[]) 41{ 42 char buff[MAX_LEN]; 43 char *filename; 44 FILE *fp; 45 int i; 46 int player_num; 47 char *data[MAX_LEN]; 48 PLAYER p[player_num]; 49 50 51 if(argv[1] != NULL) filename = argv[1]; 52 53 /*コマンドラインパラメータの数が間違っている場合の処理*/ 54 if(argc != 2){ 55 printf("Usage: ./print_player_data.c [filename]\n"); 56 exit(1); 57 } 58 59 /*ファイルを開く*/ 60 fp = fopen(filename, "r"); 61 62 /*ファイルが存在しない場合の処理*/ 63 if(fp == NULL) { 64 printf("File %s doesn't exist.\n", filename); 65 exit(1); 66 } 67 68 /*ファイルの読み込み*/ 69 i = 0; 70 while(fgets(buff, sizeof(buff) , fp) != NULL){ 71 sscanf(buff, "%s", data[i]); 72 p[i] = makePlayerData(data[i]); 73 i++; 74 } 75 76 /*ファイルを閉じる*/ 77 fclose(fp); 78 79 /*データの表示*/ 80 player_num = i; 81 for(i = player_num - 1; i >= 0; i--){ 82 printPlayerData(p[i]); 83 } 84 85 return 0; 86} 87
#baseball_player.defの内容
Tanaka 3 483 125 Yamada 9 509 143 Takahashi 24 503 152 Abe 24 498 138 Suzuki 31 518 149
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。