アプリ版:「スタンプのみでお礼する」機能のリリースについて

大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。

内容
人物の名前と年齢を入力し、表示するプログラム。
1、typedefを用いて、その構造体にpersonという名前をつける
2、main()にて以下の処理を行う。
(a)person型のサイズNの配列を用意する。
(b)N人分の名前と年齢入力して(a)で用意した配列に格納する。
(c)N人分入力後、名前と年齢を画面に表示する。



#include <stdio.h>
#define ninzu 1

typedef struct{
char name[ninzu][20];
int age[ninzu];
} person;

int main(void){
int i,ag[ninzu];
char nam[ninzu][20];
for(i=0;i<ninzu;i++){
printf("名前を入力\n");
scanf("%s\n",nam[i]);
printf("年齢を入力\n");
scanf("%d\n",&ag[i]);
}
for(i=0;i<ninzu;i++){
person pro={nam[i],ag[i]};
printf("%s\n",pro.name[i]);
printf("%d\n",pro.age[i]);
}
return(0);
}
現在、↑のところまでいったのですが、
for(i=0;i<ninzu;i++){
person pro={nam[i],ag[i]};
printf("%s\n",pro.name[i]);
printf("%d\n",pro.age[i]);
}
の部分の配列の表示の仕方がいまいちわかりません。
現在" 'char *' 型は 'char' 型に変換できない(関数 main() "のエラーが出ています。

わかり難いかもしれませんが、ご指導のほう宜しくお願いいたします。

A 回答 (2件)

下記のようなコーディングが一般的かと思います。


構造体の中に配列を用意するのではなく、「構造体の配列」を作ります。
下記のコードには問題点があり、scanfを使用しているため、
NAME_MAXよりも長い名前(100文字の名前など)を入力されると、
バッファオーバーフローを起こします。
完成度を高めたいのであれば、この辺りも考慮してみてください。

#include <stdio.h>
#define N 3
#define NAME_MAX 20

// 人間一人を表す構造体
typedef struct
{
char name[NAME_MAX];
int age;
} person;


int main(void){
int i;
person persons[N]; // N人分の配列用意
// データ入力
for(i=0 ; i<N ; i++)
{
printf("name > ");
scanf("%s" , persons[i].name); // !! ここが危険 !!
printf("age > ");
scanf("%d" , &persons[i].age);
}
// データ出力
for(i=0 ; i<N ; i++)
{
printf("name = %s\n" , persons[i].name);
printf("age = %d\n" , persons[i].age);
}
return 0;
}
    • good
    • 0
この回答へのお礼

構造体の中に配列を用意するのではなく、「構造体の配列」を作る要にすればよかったのですか。
よい機会なので、バッファオーバーフロー等も調べてみようと思います。
教えてくださった御二方、どうもありがとうございました。

お礼日時:2007/12/16 20:03

構造体の中に人数分の配列を作るのではなくて人数分の構造体配列を作るのだと思います。



#define N 10

typedef struct{
char name[20];
int age;
} person;

person pro[N];
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!