大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。
内容
人物の名前と年齢を入力し、表示するプログラム。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
c言語 構造体
-
C#でのフィボナッチ数列
-
MFC - ダイアログボックスのPic...
-
define で 配列
-
C言語についてです 5人のテスト...
-
char型配列をint型に代入するには
-
C言語の2次元配列 容量が大き...
-
関数への構造体の配列の渡し方<...
-
ヒストグラムのプログラム
-
vector配列の重複を無くすには?
-
構造体のextern方法
-
C言語を使って、ファイルの読み...
-
C言語でエラーの直し方が分かり...
-
関数内に関数は無理でしょうか...
-
C言語入門者です。アドレス演算...
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
構造体のextern方法
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
コンボボックスでデフォルト値...
-
2番目の最大値を求める
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
C言語の課題が出たのですが自力...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
ポインタを使って構造体の配列...
-
配列のアドレス部
-
char型配列をint型に代入するには
-
MFC - ダイアログボックスのPic...
-
C言語から質問です。
おすすめ情報