• ベストアンサー

ファイルを読み込むプログラム

氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • tig33
  • ベストアンサー率50% (6/12)
回答No.7

構造体配列と、構造体へのポインタの配列を混同しているようですね。 struct student *pss[number]; struct student *a[number]; は、ポインタの配列なので、実体がありません。 ここに、名前、英語の点数、数学の点数を代入するだけで、 メモリー(この場合はスタック)が破壊されてしまいます。 それで、強制終了しちゃうんですね。 グローバル変数で、 struct student StudentTable[number]; として、定義し、ここに、読みこんだ名前,英語の点数、数学 の点数を代入していけばOKになるんじゃないかな・・ #include <stdio.h> #include <string.h> #define number 100 struct student {   char name[80];   float Math;   float Eng;   float MEAve; }; struct student StudentTable[number]; char readbuf[256]; /* 文字列(text)からカンマで区切られた文字列を取り出す */ char *ExtractToken(char *cp, char *text) {   while(*text !='\0') {     if( *text == ',' ) {       text++;       break;     }     *cp++ = *text++;   }   *cp = "\0";      return( text ); } /*  指定されたカンマで区切られた文字列から、  生徒の名前、英語の点数、数学の点数をセットする */ void SetResult(char *readstr, struct student *stp) {   char buf[128], *cp;      cp = readstr;      /*名前の抽出*/   cp = ExtractToken( buf, cp );   strcpy( stp->name, buf );      /* 英語の点数の抽出 */   cp = ExtractToken( buf, cp );   stp->Eng = atof(buf);      /* 数学の点数の抽出 */   cp = ExtractToken( buf, cp );   stp->Math = atof(buf); } /*  ファイルから生徒の名前、点数を読み出して、  テーブル(最大100名)を作成する  関数の戻り値:読み込んだ生徒数 */ int SetAllResults(char *filename) {   FILE *fp;   int i;   struct student *stp;   char *rstr;      fp = fopen(filename, "rt");   if( fp == NULL ) {     fprintf(stderr,"ファイルがオープンできません\n");     return(0);   }      stp = StudentTable; /* stp=&StudentTable[0];と同じ*/   for(i=0; i<number i++) {     rstr = fgets(readbuf,sizeof(readbuf),fp);     if( rstr == NULL ) break;          SetResult(readbuf, stp);     stp++;   }      fclose(fp);      /* 読み込んだ人数 */   return( i ); } /*  個人の平均点 */ float GetStudentAve( struct student *stp ) {   stp->MEAve = (stp->Math + stp->Eng) / 2.0;      return( stp->MEAve ); } /*  全体の数学の平均 */ float GetMathAve(int Count) {   struct student *stp;   int i;   float = sum;      stp = StudentTabe;   sum = 0.0;   for(i=0; i<Count; i++) {     sum += stp->Math;     stp++;   }      return( sum / (float)Count ); } /*  英語の平均 */ float GetMathAve(int Count) {   /* 省略 */ } int main() {   int n, i;   struct student *stp;   float ave;      n = SetAllResults("input.txt");   if( n == 0 ) {     return(1);   }      stp = StudentTable; /* stp=&StudentTable[0];と同じ*/   for(i=0; i<n; i++) {     ave = GetStudentAve( stp );     printf("%sさんの平均点は、%4.1fです\n", ave);   }   printf("\n"); /*1行空ける*/   printf("数学の平均は、%4.1fです\n", GetMathAve(n));   printf("英語の平均は、%4.1fです\n", GetEngAve(n)); }

hiro3932
質問者

補足

ほんと回答ありがとうございます!! float GetMathAve(int Count) のstp = StudentTabe;が未定義のシンボル char *ExtractToken(char *cp, char *text)   *cp = "\0";の移植性のないポインタ変換 とエラーがでてしまいます… この場合すればいいですか?

その他の回答 (8)

  • tig33
  • ベストアンサー率50% (6/12)
回答No.9

>ほんと回答ありがとうございます!! >float GetMathAve(int Count) >のstp = StudentTabe;が未定義のシンボル >char *ExtractToken(char *cp, char *text) >  *cp = "\0";の移植性のないポインタ変換 >とエラーがでてしまいます… >この場合すればいいですか? 未定義のシンボル→ stp = StudentTable; *cp = "\0"; → *cp = '\0'; と修正してください。

hiro3932
質問者

補足

なおりました。 回答ありがとうございます!!!

  • tig33
  • ベストアンサー率50% (6/12)
回答No.8

GetMathAve関数の中で定義している float = sum は、間違いです。 float sum; が正解です。 失礼しました。 他にもケアレスミスがあるかも。。。大目に見てやってくださいm(__)m

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

☆設計上の根本的な誤り:人数分ファイルを開閉して、先頭レコード( yuki 65 70 )の情報のみを利用しようとしています。 ☆構造体を、struct student *a[number]; のように * 付きで宣言してますが・・。 ☆最初の関数で、struct student *pss[number]; としてるけど、[0] しか使っていないのだから・・。 ☆ n が、最初に使われるのは?。 ☆printf("%sの平均点は%dです\n",pss->Name,heikin); 【 %d 】?      (他にも) ☆ &buffer[0] は単に、buffer でいいと思うけど。 ---------------------------------------- 暇な年寄りが、関数間で構造体をやりとりしない方法で、整形してみました。 こんなんもあるよ、程度にご覧下さい。 #include <stdio.h> #include <stdlib.h> #define NUMBER 100 typedef struct{  char cName[8]; // 8, 16, 32・・, 趣味の世界  float fMth;  float fEng; }STUDENT; STUDENT sSeit[NUMBER]; // グローバル void Error( char *cMess ) {  fprintf( stderr, cMess );  exit( 0 ); } int fset_all_student( void ) {  int iNo = 0, iRet;  FILE *fp;  char cBuf[32]; // 32, 64, 128・・  fp = fopen( "input.txt", "r" );  if( NULL == fp ) Error( "input.txt をオープンできない\n" );  while( NULL != fgets( cBuf, 32, fp ) ){   iRet = sscanf( cBuf, "%s %f %f", &sSeit[ iNo ].cName, &sSeit[ iNo ].fMth, &sSeit[ iNo ].fEng );   printf( "%2d %-6s %5.1f %5.1f\n", iNo, sSeit[ iNo ].cName, sSeit[ iNo ].fMth, sSeit[ iNo ].fEng );   if( 3 != iRet ) Error( "入力項目数異常\n" );   if( NUMBER <= ++iNo ) Error( "お腹いっぱい\n" );  }  fclose( fp );  return( iNo ); // 人数を返す ≠ 0 } void get_student_average( int iii ) {  float fHeikin;  fHeikin = ( sSeit[ iii ].fMth + sSeit[ iii ].fEng ) / 2.0;  printf( "%-6sの平均点は %5.1f です\n", sSeit[ iii ].cName, fHeikin ); } void get_average( int iNo ) // iNo ≠ 0 {  int i;  float fMsum = 0.0, fEsum = 0.0;  for( i = 0; i < iNo; i++ ){   fMsum += sSeit[ i ].fMth;   fEsum += sSeit[ i ].fEng;  }  printf( "数学の平均点は %5.1f です\n", ( fMsum / (float)iNo ) );  printf( "英語の平均点は %5.1f です\n", ( fEsum / (float)iNo ) ); } void main() {  int iNo, i;  iNo = fset_all_student(); // 全員分を1回で読み込む  for( i = 0; i < iNo; i++ ) get_student_average( i );  get_average( iNo ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

hiro3932
質問者

お礼

ありがとうございました。 おかげで分かりました!!

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

> ループ条件がnumberだと実行すると強制終了になってしまいます・・ 入力ファイル件数が100件未満の場合を考慮した コードを書かれていますか? > struct student *fset_all_student(void)の関数の > n=i(この場合は3) この場合は3、の意味がわかりません。 入力データの件数が3件なのですか? 名前、数学、英語の3項目の話とごっちゃになっていませんか? 入力ファイルの行数は何行ですか?

hiro3932
質問者

補足

また回答ありがとうございます。 ファイルの読み込みが 関数*fset_all_student(void)の while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) なのでi++で読み込んだ行数をn=iで記録してにして他の関数やmain関数でこのnの値を使いたいということです。そうすれば100件未満でも読み込むことができるので。 この場合3というのは入力ファイルが3行なので input.txt yuki 65 70 rika 78 90 eri 30 60 3と言う意味です。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

おっと失礼。 > ループの終了条件は i < number でないとまずいです。 ループの終了条件、ではなくて、ループの継続条件、でした。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

> for文のところのnを実数に変えても実行できません 最大100件までデータを扱えるのですから、 ループの終了条件は i < number でないとまずいです。 また、100件読まないうちに入力が終わることがあり得ますので、 それを考慮するコードでないとまずいです。 とりあえず、外部変数 n を使わなくてすむように、 設計変更してみてはいかがでしょう。

hiro3932
質問者

補足

また回答ありがとうございます ループ条件がnumberだと実行すると強制終了になってしまいます・・ struct student *fset_all_student(void)の関数の n=i(この場合は3)の値を他の関数やmain関数で扱いたいんですがどうすればいいですか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

#1の者です。 コンパイルすると警告が出ますよね。 まず、その警告が出ないようにすることから始めてみてはいかがでしょうか。 なお、警告が出なくなったとしても、外部変数nの値がゼロであるため、 main関数における2つのfor文によるループは、どちらも実行しません。 その状態で平均値を求めようとするので、ゼロ割りか何かの エラーが出てしまうのではないでしょうか。

hiro3932
質問者

補足

回答ありがとうございます。 警告をなくしてもfor文のところのnを実数に変えても実行できません(泣)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> コンパイルはできても実行するとエラーが出ます。 どんなエラーですか?

関連するQ&A

  • 質問ですが

    教えていただきたいのですが、C言語で名前と点数を入力して合計と平均を求めるというプログラムを作ったのですが、 main関数の中で情報入力、合計と平均の計算をしているのでそれぞれ入力関数、合計を求める関数、平均を求める関数というものを作ってmain関数をすっきりとさせたいのですがどうすればいいですか? #include <stdio.h> typedef struct{ char name[15]; int jpn; int eng; int math; int sum; } stdent; typedef struct{ double sum; double jpn; double eng; double math; } Score; void maxmin(stdent *, int); main() { int i, n; n = 5; stdent person[n]; Score average; average.jpn = 0; average.eng = 0; average.math = 0; average.sum = 0; for(i = 0; i < n; i++) { printf("Student No.%d \n",i + 1); printf("Name? "); scanf("%s", person[i].name); printf("Japanese? "); scanf("%d", &(person[i].jpn)); printf("English? "); scanf("%d", &(person[i].eng)); printf("Math? "); scanf("%d", &(person[i].math)); printf("\n"); person[i].sum = person[i].jpn + person[i].eng + person[i].math; average.jpn += person[i].jpn; average.eng += person[i].eng; average.math += person[i].math; average.sum += person[i].sum; } average.jpn /= n; average.eng /= n; average.math /= n; average.sum /= n; printf(" 名前 国語 英語 数学 \n"); printf("------------------------------------\n"); for(i = 0; i < n; i++) { printf("%8s %3d %3d %3d %3d\n", person[i].name, person[i].jpn, person[i].eng, person[i].math, person[i].sum); } printf("------------------------------------\n"); printf("平均 %.1lf %.1lf %.1lf %.1lf\n\n", average.jpn,average.eng,average.math,average.sum); return 0; }

  • このプログラムどこがおかしいですか?

    コンパイルはできますが実行できません… どこがおかしいか分かる人教えてください。 このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。 #include <stdio.h> #include <string.h> #define NUMBER 10 //構造体を宣言する struct student { //名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義 char name[10]; char math[4]; char eng[4]; }; /*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/ int search(struct student *b, int n, char key) { int i=0; b[i].name[0]=key; // 番兵を追加 while (1) { if (b[i].name[0] == key) break; /* 見つけた */ i++; } return (i == n ? -1 : i); } int main(void) { FILE *fpin; struct student a[NUMBER]; int i=0, idx,ret; char buffer[20],ky; int nx=sizeof(buffer) / sizeof(buffer[0]); fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=100) break;//読み込む人数が100人を超えてる時の処理 ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割 if(ret!=3) //3に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; } printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng); i++; } printf("探す値:"); scanf("%s", &ky); idx = search(a, nx - 1, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); END: fclose(fpin); return 0; }

  • C言語について

    #include <stdlib.h > #include <stdio.h> double sum ( double data[] , int number) { double result; int a ; result = 0; for (a = 0; a < number; a+1){ result += data[a]; } return (result); } double average ( double data[] , int number) { double result; result = sum(data,number)/number; return (result); } int main ( void ) { double heikin; double data[9]; double average; int number,i; printf("数値の数を入力(1~10) = "); scanf("%d",&number); printf("データを入力 "); for( i=0;i<number;i++ ) { printf("%d個目 = ",i+1); scanf("%d",&data[i]); } heikin = average(data,number); printf("平均は%lfです\n",heikin);//文を使って平均値(heikin)を出力 return(EXIT_SUCCESS); } というプログラムがありエラーで 「35行目」で記述エラーを発見しました。 「function pointer」を付け忘れています。 と出てきます。ほかのサイト様で写真とかありえないといわれましたのでテキストで再度質問させていただきました。 よろしくお願いします。 前投稿から編集もしているので少しプログラムが違います。

  • 関数で算出した値を他の関数で使いたい。

    こんにちは。「平均点を出す関数」と「数学の点数のベスト3を出す関数」を使って、「1.平均点」と「2.数学の点数のベスト3の名前とその点数と、各々の点数と平均点との差」を求めるプログラムを作っています。平均点とベスト3の名前とその点数は出せるのですが、「平均点を出す関数」で求めた値をもって来れず、「平均点との差」がうまく表示できません。ソースは下記のようになっております。簡単な修正で直せる方法を教えていただきたいのですが。宜しくお願い致します。 #define STUDENT 4 #include <stdio.h> struct SEISEKI_T {  char name[20]; /* 生徒名を格納する配列。40バイト格納化。 */ int math; /* 数学の点数 */}; typedef struct SEISEKI_T SEISEKI; int average(SEISEKI *sp, int num, int *p); int rank_math(SEISEKI *sp, int num, int *p); int main( ) { SEISEKI seito[STUDENT] = { /* 生徒名と数学の点数のデータ */ { "佐藤", 63},{ "鈴木", 68},{ "高橋", 61},{ "田中", 40}, }; SEISEKI *sp; sp = seito; static int avg[0] = {0}; average(seito, SUBJECT, avg); rank_math(seito, SUBJECT, avg); printf("\n"); return 0; } int average(SEISEKI *sp, int num, int *p) { int i; /* ループ変数 */ static int avg[0] ={0}; for (i = 0; i < 4 ; i++) { avg[0] += (sp + i)->math; } avg[0] = avg[0] / 4 ; printf( "数学 = %3d \n", avg[0]); printf("\n\n"); } int rank_math(SEISEKI *sp, int num, int *p) { int i; /* ループ変数1 */ int j; /* ループ変数2 */ int sa_m = 0; /* 数学の上位成績者の点数と平均点との差。*/ SEISEKI dumy; /* struct SEISEKI_T 型の構造体 dumy */ for ( i = 0 ; i < STUDENT - 1 ; i++ ) { for ( j = 0 ; j < STUDENT - i - 1 ; j++ ) { if( ((sp + j)->math) < ((sp + j + 1)->math) ) { dumy = *(sp + j); *(sp + j) = *(sp + j + 1); *(sp + j + 1) = dumy; } } } printf( "■数学上位成績者\n" ); printf( "----------------------------------\n" ); printf( "順位 名前 点数 平均+\n" ); printf( "----------------------------------\n" ); for ( j = 0 ; j < 3 ; j++ ) { sa_m = (sp + j)->math - *p; printf( " %d %6s %3d %2d\n" , j + 1 , (sp + j)->name , (sp + j)->math , sa_m); } return 0; }

  • 配列 平均値と分散値

    #include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i, n; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(&i,n,&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; ????=sum/(double)????; for (i = 0; i < n; i++){ sum2 +=????; } ????=????; } 平均値と分散値を求めたいのですが、????の部分になりをいれていいかわかりません。 教えてください。

  • 標準偏差・分散

    標準偏差と分散を求めるプログラムで #include <stdio.h> #include <math.h> int main(void){ int i; double data[10]; double heikin, total = 0.0, variance = 0.0, deviation = 0.0; for ( i = 0; i < 10; i++ ){ printf("%d番目の値を入力:",i + 1); scanf( "%lf",&data[i] ); total += data[i]; } heikin = total / 10.0; for(i = 0; i < 10; i++ ){ variance += ((data[i]-heikin)*(data[i] - heikin))/10.0; } deviation += sqrt(variance); printf("平均値は%f\n" , heikin ); printf("分散は%fです。\n",variance); printf("標準偏差は%fです\n",deviation); getchar(); getchar(); return(0); } という感じでいいのでしょうか? 分散と標準偏差の式はこれであっているとおもうのですが・・・・。

  • n人の教科ごとの最高点、最低点を求めるプログラム

    n人の教科ごとの最高点、最低点を求めるプログラム C言語で、タイトルのようなプログラムを作成しています。(n≦100) 教科は国語、数学、英語の3教科です。 作る際の条件として、最高点と最低点を同時に求める関数minmaxを一つだけしか作れません。 入力例) % ./a.out number of persons: 3 Japanese Math English No.1: 90 80 70 No.2: 71 91 81 No.3: 82 72 92 min score: 71 72 70 max score: 90 91 92 現在、構造まで習いました。その知識をもとに以下のようにプログラムしました。(ただ、教科ごとの最高、最低点を求める部分は代表して国語の点の最低点を求める部分だけ載せました) #include <stdio.h> #define MAX 100 struct score{     int jpn;     int math;     int eng; }; void minmax(struct score, int, struct score *, struct score *); main(){     struct score s[MAX], min, max;     int n, i;     printf("number of persons: ");     scanf("%d", &n);     printf("Japanese, Math, English\n");     for (i = 0; i < n; i++) {         printf("No.%d: ", i+1);         scanf("%d %d %d", &(s[i].jpn), &(s[i].math), &(s[i].eng));     }     minmax(s[MAX], n, &min, &max); <------------(☆)     printf("min score: %3d%3d%3d\n", min.jpn, min.math, min.eng);     printf("max score: %3d%3d%3d\n", max.jpn, max.math, max.eng); } void minmax(struct score s[], int n, struct score *minscore, struct score *maxscore) {     int i, max, min;     for (i = 1, min = s[0].jpn; i < n; i++) {         if (min > s[i].jpn) {             min = s[i].jpn;         }     }     minscore->jpn = min; (以下略) } しかし、これをコンパイルすると、 「(☆):パラメータの型1が関数宣言と一致しません。」と出ます。 どこがおかしいのでしょうか、どなたか教えてください。

  • スタックで成績表を作るプログラム。

    成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか? class Student { private int id; private String name; private int eng; private int math; private int kokugo; Student(int i,String nm,int e,int m,int k) { id=i;name=nm;eng=e;math=m;kokugo=k; } void show(){ System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")"); } } class Stack { } class Sample { public static void main(String[] args) { Stack ss=new Stack(3); ss.push(new Student(1,"A",10,10,10)); ss.push(new Student(2,"B",20,10,10)); ss.push(new Student(3,"C",30,10,10)); ss.push(new Student(4,"D",40,10,10)); ss.pop(); ss.pop(); ss.pop(); ss.pop(); } }

    • ベストアンサー
    • Java
  • Cプログラムがどうしても動きません

    Cを勉強中です。 年齢に-1が入力されるまで、名前、年齢、性別を聞くプログラムを作っているのですが、どうしてもうまく動きません。 具体的には、年齢を聞かれず、年齢?性別?_とまとめて表示されてしまいます。 ぜひともどこが間違っているか教えてください。お願いしますm(_ _)m #include<stdio.h> typedef struct{ char name[20]; int year; char sex[6]; }student; void read_data(int,student*); void write_data(int,student*); int main(void){ student data[10]; int i=0,j=0; do{ read_data(i,data); i++; }while(data[i-1].year!=-1); for(j=0;j<=i-1;j++){ write_data(j,data); } return 0; } void read_data(int i,student *data){ printf("%d人目\n",i); printf("名前?\n",i); scanf("%s\n",&(data[i].name)); printf("年齢?\n",i); scanf("%d\n",&(data[i].year)); printf("性別?\n",i); scanf("%s\n",&(data[i].sex)); return; } void write_data(int j,student *data){ printf("%d人目\t",j+1); printf("名前:%s",data[j].name); printf("年:%d",data[j].year); printf("性:%s",data[j].sex); return; }

  • Cのプログラムがどうしても動きません

    Cを勉強中なのですが、以下のプログラムがうまくいきません。 (studentは構造体で定義した型です。) iが0でない5の倍数の時にreallocでメモリを増やそうと思ったのですが、 「21行目」(reallocの行)で記述エラーを発見しました。 「lvalue」を付け忘れています。 と表示されます。 どこが間違っているのでしょうか?教えてくださいm(_ _)m #include<stdio.h> typedef struct{ char name[20]; int year; char sex[6]; }student; void read_data(int,student*); void write_data(int,student*); int main(void){ student data[5]; int i=0,j=0; do{ read_data(i,data); i++; if(i%5==0 && i!=0){ data=realloc(data,(sizeof(student))*(i+5)); } }while(data[i-1].year!=-1); } for(j=0;j<i-1;j++){ write_data(j,data); } free(heap); return 0; } void read_data(int i,student *data){ printf("%d人目\n",i); printf("名前?\n",i); scanf("%s",(data[i].name)); printf("年齢?\n",i); scanf("%d",&(data[i].year)); printf("性別?\n",i); scanf("%s",(data[i].sex)); return; } void write_data(int j,student *data){ printf("%d人目\t",j+1); printf("名前:%s\n",data[j].name); printf("年:%d\n",data[j].year); printf("性:%s\n",data[j].sex); return; }