関数への構造体の配列の渡し方<c言語初心者>

このQ&Aのポイント
  • 関数への構造体の配列の渡し方で理解できない点があるため、質問させていただきます。
  • 以下は、関数への構造体の配列の渡し方についてのスクリプトです。
  • 構造体の配列をinput関数やoutput関数に渡す際にエラーが発生しており、解決できません。皆様のお力をお貸しいただけますでしょうか。
回答を見る
  • ベストアンサー

関数への構造体の配列の渡し方<c言語初心者>

こんにちは、関数への構造体の配列の渡し方で理解できない点があるため、質問させていただきます。 以下がスクリプトになります。3人の名前と年齢をinput関数で入力し、それらのデータをoutput関数で出力するのが目的です。 #include <stdio.h> typedef struct{ char name[64]; int age; }property; void input(property *data[]); void output(property *data[]); int main(void){ property data[3]; printf("Input data of three people.\n"); input(&data); output(&data); return 0; } void input(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:"); scanf("%s",&data[i]->name); printf(" age:"); scanf("%3d",&data[i]->age); } return; } void output(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:%s\n",data[i]->name); printf("age :%3d\n",data[i]->age); } return; } コンパイル時のエラーメッセージは以下のようになりました。(ファイル名はstructure5.c) structure5.c: In function ‘main’: structure5.c:14:2: warning: passing argument 1 of ‘input’ from incompatible pointer type [enabled by default] input(&data); ^ structure5.c:8:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void input(property *data[]); ^ structure5.c:15:2: warning: passing argument 1 of ‘output’ from incompatible pointer type [enabled by default] output(&data); ^ structure5.c:9:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void output(property *data[]); ^ structure5.c: In function ‘input’: structure5.c:24:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[64]’ [-Wformat=] scanf("%s",&data[i]->name); ^ 構造体の配列をinput関数やoutput関数に渡すときにエラーが発生しているようなのですが、自分で調べても解決できなかったため、質問させて頂きます。 皆様のお知恵を貸してください。なおプログラミング言語自体初心者のため、できる限りわかりやすいお言葉でご教授願います。よろしくお願い致します。

  • ncst
  • お礼率91% (41/45)

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

もちろん void input(property *data); にして int main(void){  property data[3];  input(data); が最も普通 (まあ大きさも渡すと思うけど) です>#7. 配列の各要素は連続して配置されますから, &data[0] = data, &data[1] = &data[0]+1 = data+1, &data[2] = &data[0]+2 = data+2 が (意味のある限りにおいて) 常に成り立ちます. つまり「ポインタの配列」を使う必要性はほとんどありません. しいて言えば「複数の配列のデータを扱うとき」には意味はあるけど, そのような状況があまり想像できない. あと void input(property (*data)[3]); とすると「大きさ 3 の配列」は渡せるけどその他の大きさの配列は渡せなくなります. ただ, 例えば property data[4][3]; とかいう 2次元配列を input(data); のように渡す (ここで &data としちゃうとさらに面倒です) と上のような形が発生します. この 2次元配列との絡みで「3」が省略できない.

ncst
質問者

お礼

配列はそもそもポインタのようなものだから、わざわざ配列をポインタにする意味がないとわかったのは、今回の大きな収穫でした。 >void input(property (*data)[3]); >とすると「大きさ 3 の配列」は渡せるけどその他の大きさの配列は渡せなくなります. ただ, 例えば >property data[4][3]; >とかいう 2次元配列を >input(data); >のように渡す (ここで &data としちゃうとさらに面倒です) と上のような形が発生します. この 2次元 >配列との絡みで「3」が省略できない. すみません、ちょっと難しいです。 今の私には少しレベルが高いようなので、もう少し勉強して、わからなかったらまた質問しに参ります。 御回答ありがとうございました。

その他の回答 (7)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.7

>でもそうすると、配列の要素全てのアドレスをinput関数に渡したいとなると、Wr5さんのおっしゃるように、あたらしくpdata[3]のようなアドレスを代入する配列を新しくつくらないといけないということになりますね。 今回の場合だったら… void input(property *data); にして int main(void){  property data[3];  input(data); でも可能かと。 ただし、input()では配列の要素がいくつあるのか(そもそも配列なのか)は知る方法がありませんけど。 #6に描かれている内容からすると… void input(property (*data)[3]); で3個だと…やれるのですかね。 こういう書き方はやったことないので不明ですが。 呼び出し側が3つ以外の配列の場合に面倒になりそうですな…。 # そんな訳で、そういうパターンだと引数1つ追加して個数も渡すようにすることが多いです。

ncst
質問者

お礼

仰る通りにやってみたら、コンパイル通りました。 void input(property *data);------(1) と void input(property data[]); と void input(property data[3]); って等価なんですね。 (上記のどの表記にせよ、input関数に渡すのは配列の先頭のアドレスに変わりはない) でも、(1)の表記はポインタを意識してしまうので紛らわしいですね。(アドレスを渡すのだからポインタっぽくていいと言えばいいのですが…。) 御回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

型はなんでも同じなんで int で書いてみる. int a; → a は int int a[3]; → a は int×3 の配列 int *a; → a は int へのポインタ int *a[3]; → a は (int へのポインタ)×3 の配列 int (*a)[3]; → a は (int×3 の配列) へのポインタ int a(); → a は引数不明の int を返す関数 int *a(); → a は引数不明の (int へのポインタ) を返す関数 int (*a)(); → a は (引数不明の int を返す関数) へのポインタ int (*a[3])(); → a は ((引数不明の int を返す関数) へのポインタ)×3 の配列

ncst
質問者

お礼

御回答ありがとうございます。 int (*a)[3]; → a は (int×3 の配列) へのポインタ の解釈はわかりましたが、 int *a[3]; → a は (int へのポインタ)×3 の配列 の説明がイマイチ理解できていないため、もう少し考えてわからなかったら、別件で新しく質問させて頂きます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「配列を関数に渡す」とき, 配列名に & を付けるのはたいてい間違いだと思っていいです. 質問文では「input関数やoutput関数に渡すとき」だけを意識していますが, 実は scanf でも警告が出ています. ちなみに今の例でど~しても input(&data); と渡したければ void input(property (*data)[3]); というプロトタイプが必要です.

ncst
質問者

お礼

仰る通り、 void input(property (*data)[3]) と記述すると見事にコンパイルが通りました。 *data[3]と書くと、"data[3]という要素のポインタ"となり、 (*data)[3]と書くと、"要素数3つのdataのポインタ"となるのかな、と私なりに解釈しました。 しかし、 void input(property (*data)[]) のように、要素数を書かないと通りませんでした。不思議です。 しばらく、このことについて調べたり、考えてみようかと思います。 御回答ありがとうございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>ミイラ取りがミイラになってますよ>#1. コピペで適当に直しただけでしたから…。 って言い訳も微妙に見苦しいな。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

おっととと. ミイラ取りがミイラになってますよ>#1. # & が余計

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

余談. 構造体じゃなくって int の配列だったらどう渡す?

ncst
質問者

お礼

intの配列の場合を考えようと、試しに以下のようなプログラムを作りました。 #include <stdio.h> int getsum(int *data[]); int main(void){ int total, array[5]={13,83,19,25,49}; total=getsum(&array); printf("%d\n",total); return 0; } int getsum(int *data[]){ int i,sum; for(i=0;i<5;i++){ sum+=*data[i]; } return sum; } すると、同じようにコンパイルエラーが出ました。 いろいろ調べてみると、(Wr5様への御礼にも書きましたが、)配列を渡す、というのは、配列の先頭のアドレスを渡す、ということで、上記のプログラムでgetsum(&array)として渡すのは間違いで、&記号はいらないわけですね。そして受け取り側も配列の型で受け取ると。 私は無理に配列の要素全てのポインタを渡そうとしていましたが、関数への配列の受け渡しはそもそもアドレスのやりとりですから、ポインタを使う意味はないですね。一応疑問は解決致しました。 ヒントといいますか、的確な道を示して下さり勉強になりました。 もし上述の私の理解に間違いがございましたら、よろしければご指摘頂ければ幸いです。 御回答ありがとうございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>void input(property *data[]); 「property型へのポインタ」の配列であって、 「property型の配列の先頭要素へのポインタ」ではない…ですよね? 単純に void input(property *data); にするべきなのではありませんか? # 実際には、配列のサイズも渡した方が汎用性(?)は上がりますが。 void input(property *data[]); でやりたいのならば…… int main(void){  property data[3];  property *pdata[3];  pdata[0] = &data[0];  pdata[1] = &data[1];  pdata[2] = &data[2];  input(&pdata); かと。

ncst
質問者

お礼

Wr5様とTacosan様の御回答から、 #include <stdio.h> typedef struct{ char name[64]; int age; }property; void input(property *data[]); void output(property *data[]); int main(void){ property data[3]; property *pdata[3]; pdata[0]=&data[0]; pdata[1]=&data[1]; pdata[2]=&data[2]; printf("Input data of three people.\n"); input(pdata); output(pdata); return 0; } void input(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:"); scanf("%s",data[i]->name); printf(" age:"); scanf("%3d",&data[i]->age); } return; } void output(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:%s\n",data[i]->name); printf("age :%3d\n",data[i]->age); } return; } と書いてみたら、無事コンパイルできました。 こうしてみると、input関数(引数:ポインタ)に渡すときに構造体の配列を input(&data)として渡すことはできないのですね。 もしかして、配列は先頭のアドレスを渡すから、&は必要ないということですか。なるほど。 でもそうすると、配列の要素全てのアドレスをinput関数に渡したいとなると、Wr5さんのおっしゃるように、あたらしくpdata[3]のようなアドレスを代入する配列を新しくつくらないといけないということになりますね。 もし間違っていましたらご指摘下されば幸いです。 御回答ありがとうございました!

関連するQ&A

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • C言語 構造体の並び替え 

    #include<stdio.h> typedef struct{ char mozi[10]; char namae[30]; }PE; void input_profile(PE *p,int *a); void printf_profile(PE *p,int *a); int main(void) { int i=0; PE c[999]; input_profile(c,&i); return 0; } void input_profile(PE *p,int *a){ int c,b; for(b=0;999>b;b++) { printf("名前を入力\n"); scanf("%s",(p+b)->namae); printf("文字を入力\n"); scanf("%s",(p+b)->mozi); printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n"); scanf("%d",&c); if(c==0)break; } b++; *a=b; printf_profile(p,a); } void printf_profile(PE *p,int *a) { int b; for(b=0;*a>b;b++) { printf("NO%d\n",b+1); printf("文字%s\n",(p+b)->mozi); printf("名前%s\n",(p+b)->namae); } } このプログラムを 自分で関数を作って データ一覧をmoziのアルファベット順に表示するように書きなおしたいんですけど どうなるのでしょうか? どうか教えてください

  • 構造体配列

    いつもお世話になっています。 今日構造体配列を勉強した際に下の演習をしていたのですが、いまいち基礎的な関数や配列のことやコマンドライン引数のことが理解できていません。一応自分なりにプログラムを書いてみたのですが、エラーがでます。 どなたかアドバイス・ご指摘・解説・例などをおねがいいたします。 問題はコマンドライン引数で人数を指定し,人数分のデータを標準入力(キーボード)から構造体配列に入力し,標準出力(ディスプレイ)に出力するプログラムです。 #include<stdio.h> typedef struct{ char name[100]; int age; double height; double weight; } PERSONAL_DATA1; typedef struct{ int person[10]; }PERSONAL_DATA2; PERSONAL_DATA1 input_personal_data(int num); void output_personal_data(PERSONAL_DATA2 person[10],int num); int main(int argc, char *argv[]){ PERSONAL_DATA1 x; int num,i; char person[10]; if(argc != 2){ printf("Usage ./test number"); return 0; } num=atoi(argv[1]); for(i=0;i<10&&i<num;i++){ person[i]=input_personal_data(); output_personal_data(person,num); return 0; } } PERSONAL_DATA input_personal_data(void){ PERSONAL_DATA1 x; printf("name>"); scanf("%c" ,&x.name); printf("age>"); scanf("%d" ,&x.age); printf("height>"); scanf("%lf" ,&x.height); printf("weight>"); scanf("%lf" ,&x.weight); return x; } void output_personal_data(PERSONAL_DATA2 person[10],int num){ PERSONAL_DATA1 x; printf("name>>%s\n" ,x.name); printf("age>>%d\n" ,x.age); printf("height>>%lf[cm]\n" ,x.height); printf("weight>>%lf[kg]\n" ,x.weight); } またコマンドライン引数で指定したデータファイルAから入力した個人データ集合を構造体配列に取り込み,標準出力(ディスプレイ)と同じくコマンドライン引数で指定したデータファイルBへファイル出力に出力するプログラムというおまけの問題もあります。 こちらの問題のヒントもいただけませんか?

  • C言語の構造体について

    ご質問があります。 現在C言語について学習しているのですが、構造体を勉強しているときに下記のようなコードを作ったのですが storage size of 'mydata' isn't known というエラーが出てきてしまいます。 どこが間違っているのかがわかりません。 ご指南ご指導して頂けると助かります。 以下コード int main(void){ struct data mydata; mydata.name = "Yamada"; mydata.age = 30; mydata.height=173; mydata.weight = 65.4; printf("name = %s\n",mydata.name); printf("age = %d\n",mydata.age); printf("height = %d\n",mydata.height); printf("weight = %1f\n",mydata.weight); return EXIT_SUCCESS; }

  • 構造体を引数とする関数について

    関数に構造体を渡したいのですが、エラーが出て上手くいきません。 下のプログラムのように組んでいるのですが、どこが問題なのかご教授願いたいです。 もし、下記のプログラムのようなことができないのでしたら、代替案を提示してもらえると助かります。 環境はVC++です。よろしくお願いします。 struct DATA{ int x; char name[32]; }; void info(DATA *status[]); int main(void){ DATA student[3] = { { 1, "佐藤" }, { 2, "高橋" }, { 3, "田中" }, }; info(&student[]); return 0; } void info(DATA *status[]){ for (int i = 0; i < 3; i++){ printf("%d\n%s", status[i]->x, status[i]->name); } }

  • c言語つくってみました

    #include<stdio.h> #define N 5 struct MEMBER{ int no; char name[8+1]; int run; int jump; int power; int sum; double avg; }; void Calc_Sum(struct MEMBER *data) { data->sum=data->run+data->jump+data->power; return(0); } void Calc_Avg(struct MEMBER *data) { data->avg=data->sum/3.0; return(0); } void Display_Data(struct MEMBER data) { printf("---判定---\n"); printf("背番号:%5d\n",data.no); printf("名前:%5s\n",data.name); printf("走力 :%5d 点数\n",data.run); printf("跳躍力:%5d 点数\n", data.jump); printf("筋力 :%5d 点数\n", data.power); printf("総計 :%5d 点数\n", data.sum); printf("平均 :%5.1f 点数\n", data.avg); return(0); } int main(void) { int i; struct MEMBER member[N] ={{51,"イチロー",95,95,80,0,0}, {55,"松井秀喜",70,80,90,0,0}, {18,"松坂大輔",75,75,80,0,0}, {18,"黒田博樹",80,85,85,0,0}, {19,"上原浩治",85,85,85,0,0}, }; struct MEMBER *p=member; /*総計の算出*/ for(i=0;i<N;i++) Calc_Sum(p+i); /*平均の算出*/ for(i=0;i<N;i++) Calc_Avg(p+i); /*結果の出力:*/ for(i=0;i<N;i++) Display_Data(member[i]); return(0); } 以上のようなのc言語をつくりました。 他に関数を2つ使用しなければならないのですが アドバイスよろしくお願い致します。

  • C言語 「構造体のソートと結果のファイル出力」 緊急です。助けてください。

    授業で課題が出され内容は以下となってます。 1.歴代アメリカ大統領の情報を構造体とする. 2.ソートを昇順で行うこと 3.結果を出力すること〔参考:http://www-it.sci.waseda.ac.jp/CPR1/class08/kekka.log) 以下が自分で作ってみたものですが、多数のエラーが出てしまいどうしたらいいのか分かりません。。。抜本的な変更でもかまいませんので、分かる方助けてください。 -----作成分------ #include <stdio.h> #include <string.h> struct president { int no, age; char name1[20], name2[20]; /* 氏名 */ }; int main(void) { int i; struct president pre1[44] = { {1,57,"George","Washington"}, {2,61,"John","Adams"}, {3,57,"Thomas","Jefferson"}, //リストが長いので省略// {44,47,"Barack","Obama"}, }; struct president *pres; pres = pre1; //ポインタ// sort(pres, 44, sizeof(struct president), president_cmp);//ソート構文 エラーがでます。。。// printf("---------sortted list by age------- \n # age first last \n");} for (i = 0; i < 44; i++){printf("------------------------------------ \n") printf("%d %d %s %s \n, pres[i]->no, pres[i]->name, pres[i]->name1, pres[i]->name2);} for(i = 0; i < 44; i++) { if (i==0){printf("---------list of presidents---------- \n");//RAW DATAの表示を行ない。ここは問題ないみたいです// printf(" age first last \n");}; printf("%d %d %s %s \n", pres->no, pres->age, pres->name1, pres->name2); ++pres; } return 0; } int president_cmp(const void*p1, const void*p2){ //比較関数// struct president *cmp1 = (struct president*)p1; struct president *cmp2 = (struct president*)p2; return strcmp(cmp1->age, cmp2->age); } ここにファイル出力の分をたしたいのですが、どこにどうすればいいのでしょう。 大変申し訳ありませんが、緊急です!!お願いします。

  • プログラミング構造体について。

    include<stdio.h> #include<stdlib.h> #include<string.h> struct person{ char name[10]; int gender; int age; }; void printPersonList(struct person *person_p, int size); void outputPersonList(struct person *person_p, int size); double getAverageOfAge(struct person *person_p, int size); int countMales(struct person *person_p, int size); int countFemales(struct person *person_p, int size); int main(void){ struct person *person_p; int i, count, gender, age, maleCount, femaleCount; char name[20]; double average; printf("登録する人数を入力してください。\n"); scanf("%d", &count); person_p = (struct person*)malloc(sizeof(struct person)* count); for(i=0; i < count; i++){ printf("名前・性別(男性:0, 女性:1)・年齢をスペース区切りで入力してください。\n"); scanf("%s %d %d", name, &gender, &age); strcpy((person_p + i) -> name, name); (person_p + i) -> gender = gender; (person_p + i) -> age = age; } printPersonList(person_p, count); outputPersonList(person_p, count); average = getAverageOfAge(person_p, count); printf("平均年齢:%f\n", average); maleCount = countMales(person_p, count); femaleCount = countFemales(person_p, count); printf("男性:%d名, 女性:%d名\n", maleCount, femaleCount); free(person_p); return 1; } void printPersonList(struct person *person_p, int size){ int i; printf("登録リスト\n"); printf(" name | gender | age\n"); printf("----------+--------+-----\n"); for(i=0; i < size; i++){ printf("%10s | %1d | %2d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } } void outputPersonList(struct person *person_p, int size){ FILE *output; int i; if((output = fopen("meibo.c", "w")) == NULL){ printf("meibo.cを開けませんでした。\n"); return; } for(i=0; i < size; i++){ fprintf(output, "%s, %d, %d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } fclose(output); } 残り3つの関数をすべて定義する(それぞれ10行程度) getAverageOfAge, countMales, countFemales どう定義すればいいのか教えてください。お願いします。

  • C言語で、引数が構造体の場合

    生徒の名前、点数、順位を表示するプログラムをつくりたいのですが、(下のような関数を用いることを前提として) void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } このような場合、関数の引数として、構造体が用いられているわけですよね? 引数が構造体の場合、どのように引数の部分を書けばいいのか分かりません。 私が考えたプログラムは下記の通りです。 もちろんうまくいきませんでした。 たぶん最後のprintfの所のrank1の引数が間違っているだけだと思うんですが、どうでしょうか? include<stdio.h> struct data { char name; int score; int rank; }; void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } void main(void) { int m; static struct data x[] = {{'A',56,1}, {'B',79,1}, {'C',34,1}, {'D',91,1}, {'E',69,1}}; for(m=0;m<5;m++) printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m)); }

専門家に質問してみよう