- ベストアンサー
構造体について
- 構造体についての質問です。RECORDに5件のデータを追加したいですが、inputdata(void)の宣言文エラーが出ています。また、inputdataを用いてデータを入れる方法がわかりません。教えてください。
- 構造体についての質問です。RECORDに5件のデータを追加したいですが、inputdata(void)の宣言文エラーが出ています。また、inputdataを用いてデータを入れる方法がわかりません。お教えいただけますでしょうか。
- 構造体に関する質問です。RECORDに5件のデータを追加する方法について教えてください。inputdata(void)の宣言文エラーが出ているため、どのように修正すべきかも教えていただけますと幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 > C言語ではこの方法は取れない。 ごめん、これ嘘。確かC言語はある時期から構造体のビットコピーができるようになった。書き直したのでこっちを参考にしてくらはい。ついでに5人分溜め込んであとで使うという動きの参考になるようにした。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; } YMD; typedef struct { char name[20]; YMD birthday; int age; } RECORD; RECORD inputdata(void) { RECORD p; printf("名前>"); scanf("%s", p.name); printf("誕生日入力\n"); printf("年>"); scanf("%d", &p.birthday.yy); printf("月>"); scanf("%d", &p.birthday.mm); printf("日>"); scanf("%d", &p.birthday.dd); return p; } void main(void) { int i; RECORD person[5]; for(i = 0; i < SIZE; i++) { person[i] = inputdata(); } for(i = 0; i < SIZE; i++) { printf("%i人目のお名前は%s、生まれた年は%d年です\n", i+1, person[i].name, person[i].birthday.yy); } }
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
コンパイルエラーはただ単にmain関数が閉じていないだけだと考えられる。 で、RECORD構造体に値を入れるのは、scanfを使う場合、nameはこれで良いが他の3つは&person.birthday.yyなど、&をつけなければならない。 ところで、inputdata関数内でRECORD変数を作ってそれを返しているが、C言語ではこの方法は取れない。なぜならば、大抵の場合、この変数はスタック上に取られ、inputdata関数が終了した時点で意味の無い領域になるからだ(使える場合もあるのだが、それは逆にとても危険な事)。なので、例えばmain関数の方で変数を作ってそのアドレスを渡すなどの処理が必要だ。 なるたけ手を加えずにソースを整理してみたので、参考にして欲しい。コンパイルが通ってとりあえず動いたら、エラーチェックなどを追加してみよう。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; } YMD; typedef struct { char name[20]; YMD birthday; int age; } RECORD; int inputdata(RECORD *p) { printf("名前>"); scanf("%s", p->name); printf("誕生日入力\n"); printf("年>"); scanf("%d", &p->birthday.yy); printf("月>"); scanf("%d", &p->birthday.mm); printf("日>"); scanf("%d", &p->birthday.dd); return 0; } void main(void) { int i; RECORD person[5]; for(i = 0; i < SIZE; i++){ inputdata(&person[i]); printf("%i人目のお名前は%s、生まれた年は%d年です\n", i+1, person[i].name, person[i].birthday.yy); } }
お礼
ありがとうございます。 おかげでよくわかりました。