質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

852閲覧

構造体のポインタ配列に全て同じものが代入されてしまいます。

yuyu_

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/09 13:57

編集2018/12/09 14:53

前提・実現したいこと

テキストファイルを読み込み、構造体のポインタ配列に代入し、表示させるプログラムを作ろうと思っています。

発生している問題

構造体を1つにしたところ上手くできたのですが、構造体を2つにするとなぜ全ての要素に同じものが代入されてしまうのかがわからず困っています。
できれば解決方法も教えていただきたいです。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5typedef struct species{ 6 char name[20]; 7 int hp; 8 int atk; 9 int def; 10}species; 11 12typedef struct character{ 13 struct species *spe; 14 int lv; 15 }character; 16 17int main(void){ 18 FILE *file; 19 int counter=0,currentSize=10; 20 int i; 21 character *chara; 22 char str[40],name[20]; 23 chara=(character *)malloc(currentSize*sizeof(character)); 24 file=fopen("test.txt","r"); 25 while(fgets(str,40,file)!=NULL){ 26 character temp; 27 species temp2; 28 sscanf(str,"%s %d %d %d\n", 29 temp2.name,&temp2.hp, 30 &temp2.atk,&temp2.def); 31 temp.lv=1; 32 temp.spe=&temp2; 33 chara[counter]=temp; 34 chara[counter].lv=1; 35 counter++; 36 for(i=0;i<counter;i++){ 37 printf("%s %d %d %d %d\n", 38 chara[i].spe->name,chara[i].spe->hp, 39 chara[i].spe->atk,chara[i].spe->def,i); 40 } 41 } 42 free(chara); 43 fclose(file); 44} 45

###読み込んだテキストファイル

AAA 1 2 3 BBB 4 5 6 CCC 7 8 9

実行結果

AAA 1 2 3 0 BBB 4 5 6 0 BBB 4 5 6 1 CCC 7 8 9 0 CCC 7 8 9 1 CCC 7 8 9 2

実現したい実行結果

AAA 1 2 3 0 AAA 1 2 3 0 BBB 4 5 6 1 AAA 1 2 3 0 BBB 4 5 6 1 CCC 7 8 9 2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

while(fgets(str,40,file)!=NULL){

character temp; species temp2;

ループの中で宣言しても、その変数は一つだけしか生成されません。

chara[x].spe の値はxが何であろうと同一となりますね

投稿2018/12/09 14:23

編集2018/12/09 14:34
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuyu_

2018/12/09 14:55

sscanfで直接chara[counter]に代入しても同じようになってしまうのですがなぜでしょうか?
y_waiwai

2018/12/09 23:38

> chara=(character *)malloc(currentSize*sizeof(character)); ここで確保してるのはcharacterの配列分のエリアですが、 chara[counter].spe がどこを指してるのか考えてみましょう spe の指す先はどこで確保してますか?
yuyu_

2018/12/11 11:22

speの指す先を変数tempとしてwhile文の中で宣言していますが、while文のループで1回1回宣言するtempのアドレスは全て同じ(使い回し)なのですね。初めて知りました。だから1番最近の要素を書き換えると全ての要素で書き換わってしまうのですね。ありがとうございます。 ありがとうございます。
guest

0

ベストアンサー

y_waiwaiさんのアドバイスに従い、作成しなおしました。
species temp2はmallocで割り当てたメモリを使用しないといけません。
以下のようにしてください。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5typedef struct species{ 6 char name[20]; 7 int hp; 8 int atk; 9 int def; 10}species; 11 12typedef struct character{ 13 struct species *spe; 14 int lv; 15 }character; 16 17int main(void){ 18 FILE *file; 19 int counter=0,currentSize=10; 20 int i; 21 character *chara; 22 char str[40],name[20]; 23 chara=(character *)malloc(currentSize*sizeof(character)); 24 file=fopen("test.txt","r"); 25 while(fgets(str,40,file)!=NULL){ 26 character temp; 27 species *temp2; //MOD 28 temp2 = (species *)malloc(sizeof(species)); 29 sscanf(str,"%s %d %d %d\n", 30 temp2->name,&temp2->hp, //MOD 31 &temp2->atk,&temp2->def); //MOD 32 temp.lv=1; 33 temp.spe=temp2; //MOD 34 chara[counter]=temp; 35 counter++; 36 for(i=0;i<counter;i++){ 37 printf("%s %d %d %d %d\n", 38 chara[i].spe->name,chara[i].spe->hp, 39 chara[i].spe->atk,chara[i].spe->def,i); 40 } 41 } 42 free(chara); 43 fclose(file); 44} 45

以下実行結果です。
AAA 1 2 3 0
AAA 1 2 3 0
BBB 4 5 6 1
AAA 1 2 3 0
BBB 4 5 6 1
CCC 7 8 9 2

species *temp2に割り当てたメモリの解放までは行っていませんので必要であれば自分で行ってください。

投稿2018/12/10 01:54

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuyu_

2018/12/11 11:23

丁寧にありがとうございます。 自分の方でも書き換え、無事実現したい実行結果を得ることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問