
大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。
内容
人物の名前と年齢を入力し、表示するプログラム。
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() "のエラーが出ています。
わかり難いかもしれませんが、ご指導のほう宜しくお願いいたします。

No.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;
}
構造体の中に配列を用意するのではなく、「構造体の配列」を作る要にすればよかったのですか。
よい機会なので、バッファオーバーフロー等も調べてみようと思います。
教えてくださった御二方、どうもありがとうございました。
No.1
- 回答日時:
構造体の中に人数分の配列を作るのではなくて人数分の構造体配列を作るのだと思います。
#define N 10
typedef struct{
char name[20];
int age;
} person;
person pro[N];
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
c言語
-
配列の要素数に変数を入れたい...
-
c言語 構造体
-
int i, int i[1];
-
MFC - ダイアログボックスのPic...
-
構造体を引数とする関数について
-
.NET C++で、構造体の配列をnew...
-
MFCのCArrayを使った二次元配列
-
C# Listを使わずに2次元配列の...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語 配列の長さの上限
-
CStringからchar*への型変換に...
-
C言語のポインタに直接アドレス...
-
VBA基本構文の作り方 2列の...
-
構造体のリストをソートしたい。
-
【速いブラインドタッチ】手を...
-
配列を使わずに、変数名を動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
c言語
-
C言語 ファイルの指定された行...
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語の課題が出たのですが自力...
-
char型配列をint型に代入するには
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
コンボボックスでデフォルト値...
-
MFC - ダイアログボックスのPic...
-
c言語 構造体
-
2番目の最大値を求める
-
C言語から質問です。
-
Cのエラー
-
プログラミングに関する問題が...
-
C言語の2次元配列 容量が大き...
-
Visual C++を 用いたテキストフ...
おすすめ情報