構造体の各データの表示についてのプログラム作成とコンパイルエラー

このQ&Aのポイント
  • C言語において、構造体の各データを表示するプログラムを作成しましたが、コンパイルエラーが発生しました。
  • プログラムの修正によってコンパイルエラーを解消する方法を教えてください。
  • プログラム内で構造体のメンバーに文字列を代入する際にエラーが発生しています。
回答を見る
  • ベストアンサー

構造体の各データの表示について以下のようなプログラムを作成しました。

構造体の各データの表示について以下のようなプログラムを作成しました。 #include <stdio.h> struct tb{ char name[20]; char sex; int age; double height; double weight; }; int main(void) { int i; struct tb test[2]; test[0].name="amada" test[0].sex='f'; test[0].age=20; test[0].height=172.5; test[0].weight=62.5; test[1].name="okada"; test[1].sex='f'; test[1].age=21; test[1].height=180.2; test[1].weight=70.8; for(i=0; i<2; i++){ printf("%s %s %d %f %f \n",test[i].name,test[i].sex,test[i].age,test[i].height,test[i].weight); } return 0; } ファイル名を適当にsample.cとしてgcc sample.c した所、以下のようなコンパイルエラーが出ました。 sample.c: In function ‘main’: sample.c:18: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ sample.c:18: error: expected ‘;’ before ‘test’ sample.c:23: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ このエラーを元にソースをどのように修正したらよいか教えて頂けますでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • andy_kun
  • ベストアンサー率23% (64/274)
回答No.2

エラーメッセージに書いてある通り 構造体を以下のように定義するか struct tb{ char name[20]; -> char *name char sex; int age; double height; double weight; }; #include <string.h> を追加して strcpy(test[0].name,"amada"); にするかのいずれか(後者の方がいいと思うけどね) あとは >test[0].name="amada" 文末に;が無いね。

nardobrea
質問者

補足

直してもエラーが出たので詰まりましたが、アドバイスのおかげで 何とか出来ました。ありがとうございました

その他の回答 (3)

  • rict-mict
  • ベストアンサー率29% (9/31)
回答No.4

まずtest[0].name="amada"に『;』が抜けています。まあ今回はこれが原因ではありませんが・・・・ 最初に#include <stdio.h>だけなく#include <string.h>をその下に入力してください。 次にtest[0].name="amada";では実行できません。 strcpy(test[0].name,"amada");と書き換えてください。 同様にtest[1].name="okada";をstrcpy(test[1].name,"okada");に書き換えてください。 これでいいはずですよ

nardobrea
質問者

補足

文字のコピーはそのままではダメなんですね。 勉強になりました。ありがとうございました。

回答No.3

sample.c:18: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ 構造体の宣言時の初期設定以外で、配列要素に文字列リテラルは代入できません。 strcpy関数等でコピーしてください。 sample.c:18: error: expected ‘;’ before ‘test’ 文末の「;」が抜けています。 sample.c:23: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’ これが一番上と同じ。

nardobrea
質問者

補足

「;」にすら気付かないとは… 焦っていたのかな? ありがとうございました。

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.1

test[0].name="amada" これを strcpy(test[0].name,"amada"); test[1].name="okada"; これも strcpy(test[1].name,"okada"); です。 間違いの理由は 文字列へ文字列へのポインターを代入したとエラーになっています。 つまり、 test[1].name="okada"; これは暗示キャストをつけると (char[20])test[1].name=(char *)"okada"; なので、型が違うので代入はできないよーということです。

nardobrea
質問者

補足

ありがとうございました。おかげ様で解決できました。

関連するQ&A

  • 構造体配列

    いつもお世話になっています。 今日構造体配列を勉強した際に下の演習をしていたのですが、いまいち基礎的な関数や配列のことやコマンドライン引数のことが理解できていません。一応自分なりにプログラムを書いてみたのですが、エラーがでます。 どなたかアドバイス・ご指摘・解説・例などをおねがいいたします。 問題はコマンドライン引数で人数を指定し,人数分のデータを標準入力(キーボード)から構造体配列に入力し,標準出力(ディスプレイ)に出力するプログラムです。 #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へファイル出力に出力するプログラムというおまけの問題もあります。 こちらの問題のヒントもいただけませんか?

  • 構造体についてです。

    身体測定表を作っていて最初に作ったデータを変更して表示したいのですがNo1の168cm→162cm No2の74kg→74.5kg  No3の20歳→19歳 No4の田中三郎→小林三郎 (No3と4は構造体ポインタを使ってデータを変更) 全データを表示させてその後No1と3の名前~体重を丸ごと入れ替えて全データを表示させたいのですがエラーがでてしまいます。 分かる人がいましたらどこを直したらいいか教えて下さい。 #include <stdio.h> #include <string.h> struct data{ int no; char name[21]; int age; int height; float weight; }; struct data *sp; void main(){ int i; struct data a[4]={ {1,"鈴木太郎",23,168,60}, {2,"山本次郎",17,180,74}, {3,"山田花子",20,156,53}, {4,"田中三郎",35,172,68}, }; struct data b; for(i=0;i<4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i]. weight); } a[0].height=162; a[1].weight=74.5; *sp[2].age=19; strcpy(*sp[3].name,"小林三郎"); for(i=0;i<=4;i++){ b=a[0]; a[0]=a[2]; a[2]=b; a[0].no=1; a[2].no=3; } for(i=0;i<=4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i].weight); } }

  • 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; }

  • 構造体の配列について

    --------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[80]; int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[1].name,"日本太郎");    //// (1) //// dt[1].weight=70; dt[1].height=180; dt[5]=dt[1];    //// (2) //// printf("%s %d %d \n",dt[1].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------- 以上のプログラムは参考書に記述されていたものですが、(1)の部分で、配列名dtに「"日本太郎"」を設定するならわかるのですが、配列の1つの要素「dt[1]」に「"日本太郎"」を設定しているというように見え、これはエラーが出ると感じたのですが出ません。 char dt[10]; strcpy(dt[1],"日本太郎"); 以上のようにしてしまっているというイメージがあります。 後、(2)の部分もよくイメージがわきません。 以上、どのような仕組みになっているのか教えていただければ嬉しいです。

  • 構造体とポインタについて教えてください。

    #include <stdio.h> typedef struct ningen { char *name; char *sex; int age; } NINGEN; NINGEN data = {"牧村 五郎",NULL,30}; char mf[2][3] = {"男","女"}; void main(void) { data.sex=mf[0]; printf("%s (%s) %d歳\n", data.name, data.sex, data.age); } このプログラムで実行結果は 牧村 五郎 (男) 30歳 となるのですが、最初の typedef struct ningen { char *name; char *sex; int age; } NINGEN; のところで、nameとsexはアドレスで宣言しているので printf("%s (%s) %d歳\n", data.naem, data.sex, data.age);でのdata.naem, data.sexでの対象もアドレスを示していると思うのですが、 結果は値を表示しているのはなぜでしょうか?

  • 構造体のプログラミング...練習です。

    構造体のプログラミング...練習です。 #include <stdio.h> int main ( void ) { int i; struct rool{ char name[20]; float height; char bloodType; }date[128]; for(i = 0;; i++) { printf("%d人目のデータ:", i + 1 ); scanf("%s %f %c",date[i].name[i], &date[i].height, &date[i].bloodType); if((date[i].name[0] == '0') && (date[i].height == 0) && (date[i].bloodT\ ype == 0)) { break; } } printf("名前    体重     歳\n"); for(i = 0; (date[i].name[0] == '0') && (date[i].height == 0) && (date[i].bl\ oodType == 0); i++) { printf("%s, %10s, %10s\n",date[i].name[i], date[i].height, date[i].bloodTy\ pe); } return 0; } 構造体を使ったプログラミングです。 名前と体重、歳を入力して0 0 0が入力されたら、今まで入力したものを表示する。というものです。 セグメントエラーが出て困っています。 入力をしてエンターキーを押すと、何人目のデータ:何人目のデータ:~と言うふうにでて、セグメントエラーで止まります。 よろしくお願いします。

  • 構造体の配列について(2)

    前回「構造体の配列について」という質問タイトルで、質問させていただいたのですが、理解が完全ではないため同じようなプログラム内容ではありますが、疑問を書かせていただきます。よろしくお願いします。 ----------------------------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[1];    //// (1) //// int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); dt[1].weight=99; dt[1].height=168; printf("%s %s %s %d %d \n",dt[0].name,dt[2].name,dt[9].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------------------------- 以上のプログラムの(1)の部分で、文字を1文字しか格納出来ないのに、 strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); としても何故正しく実行できるのかわかりません。 前回いろいろとご回答いただいたのに、しっかりと理解できない者ですが、教えていただければ嬉しいです。

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

    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のプログラミングに困っています(>_<) テキストファイル(meibo.txt) 田中 32 公務員 佐藤 20 学生 というファイルを読み込んで、構造体に入れて表示するには どうしたらよいでしょうか? struct meibo{     char name[20];     int age;     char job[20]; }list[3]; としたあとにどのように入れたらよいかがわかりません… わかる方教えてくださいm(_ _)m

  • C言語/構造体の宣言と初期設定について

    C言語初心者です。 私が使用している参考書の記載に誤りがあるのか確認したくて質問させて頂きました。 宜しくお願い致します。 struct person{  char name[40];  int height;  int weight; } struct person dt = {"山田太郎", 70, 180}; printf("%s %d %d\n", dt.name, dt.weight, dt.height); このコードで出力されるのは、 山田太郎 70 180 とのことですが、 宣言時のメンバの順番と、 初期化時の値の順番が、 上の記述だと一致していないように私には思えます。 参考書にある上記の記載は、はたして、正しいのでしょうか?

専門家に質問してみよう