• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体とfscanf)

構造体とfscanfでファイルから文字列を読み込む方法

このQ&Aのポイント
  • ファイルをfscanfを使って文字列を構造体に格納して読み込む方法について知りたいです。
  • ソースコードの記述方法がわからず困っています。どのようにしたら読み込むことができるでしょうか?
  • 例えば、yasa.txtというファイルに以下のようなデータが入っていて、それを構造体に格納したいです。オレンジ ● みかん ● いちご × もも ● ぶどう × キウイ ●

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>//2回目の呼び出し方法での記述の仕方がわからない deta2はポインタ変数しか持っていませんのでmalloc()などで必要な領域を確保してから、 その場所(ポインタが指している先)に読み込んで下さい。 問題は「確保するべき領域のサイズが判らない」ということですが…。 char ReadTemp1[100],ReadTemp2[100]; とかを用意して、 fscanf( fp, "%s %s",ReadTemp1,ReadTemp2 ); deta2.name = malloc(strlen(ReadTemp1)+1); //'\0'の分が必要 strcpy(deta2.name, ReadTemp1); deta2.mb = malloc(strlen(ReadTemp2)+1); //'\0'の分が必要 strcpy(deta2.mb, ReadTemp1); という感じで入れます。 # 使い終わった後の開放を忘れずに。 ちなみにdeta2は1個分子かありませんから、続きのデータは読めません。 detaと同じように、その場で使うだけならその都度開放して下さい。 deta3は、ポインタの配列が6個分ありますからそれぞれに領域確保して読み込ませておくこともできるでしょう。 やり方自体はdata2の時のように作業用領域に読み込んでメモリ確保して、コピーして…の繰り返しです。

nanaka2223
質問者

お礼

できました こんな感じですね #include <stdio.h> #include <string.h> #include <stdlib.h> struct info //1回目の呼び出し方法 { char name[20]; char mb[20]; }deta; struct info2 //2回目の呼び出し方法 { char *name; char *mb; }deta2; struct info3 //3回目の呼び出し方法 { char *name[6]; char *mb[6]; }deta3; void main(void){ FILE *fp; char n[100],m[100]; char a[6][100],b[6][100]; int i=0; fp=fopen("yasa.txt","r+"); while( !feof( fp ) ){ fscanf( fp, "%s %s",deta.name,deta.mb); printf("%s %s\n",deta.name,deta.mb); } printf("\n"); rewind( fp ); while( !feof( fp ) ){ fscanf( fp, "%s %s",n,m); deta2.name= (char*)malloc(strlen(n)+1); strcpy(deta2.name, n); deta2.mb= (char*)malloc(strlen(m)+1); strcpy(deta2.mb, m); printf("%s %s\n",deta2.name,deta2.mb); free(deta2.name); free(deta2.mb); } printf("\n"); rewind( fp ); while( !feof( fp ) ){ fscanf( fp, "%s %s",a[i],b[i]); deta3.name[i]= (char*)malloc(strlen(a[i])+1); strcpy(deta3.name[i], a[i]); deta3.mb[i]= (char*)malloc(strlen(b[i])+1); strcpy(deta3.mb[i], b[i]); printf("%s %s\n",deta3.name[i],deta3.mb[i]); free(deta3.name[i]); free(deta3.mb[i]); i++; } fclose(fp); }

nanaka2223
質問者

補足

なるほどmallocを使うのですね ぜんぜん思いつきませんでした ソースも書いていただきありがとうございます。 開発可能なPCに戻して試してみますね

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.6

>そのため、サーバー管理会社は使いません。迷惑をかける可能性が少しでもあるから そのため多額な賠償請求もされません。 ちょっと考えが甘いです。 もし、あなたが運用されるサーバーが踏み台にされ他者に迷惑をかけた場合、加害者扱いになる可能性がありますので迷惑をかけたところからの賠償請求はありえます。

nanaka2223
質問者

お礼

その話は聞いてますよ そのためアタック対策は万全にしようって話ですね もちろん忘れてはいませんよ 今はまだ少ししか対策していませんがこれからゆっくり対策していきますよ どんなものでも一気に全部できるわけではないので、少しづつ作っていきます

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

> あふれたデータ云々はよくわからないようなことになりそうなら、プログラムとして問題ないなら放置。 > バグがでてきたらその時処理するでしょうね。 こんな考えでC言語、特にポインタ絡みの操作を使ってほしくないです。 御自身のPCが壊れるだけなら自業自得で済みますが、これでCGIを作ろうとしてますよね? 被害が全世界に及ぶ可能性とか、サーバー管理社から多額の賠償請求される可能性とか、考えたことありますか?

nanaka2223
質問者

お礼

ちなみにこうは言いますが、決していい加減なものを作るつもりはありませんよ 何せ私が作る作品を愛していますからね。 例え他の人が私のやり方では愛していないように見えるのでしたら、それでもかまいませんよ ですが他の人がなんと言おうとも私は自分の作品を愛してます。 確かに私はバグがでるまで待っているところはありますが、師事する先生も教科書もないならバグと向き合ってバグの対処法を覚える事で、いろいろな可能性が見えてくるのです。 試行錯誤はけっこうしますが、それは決して無駄な事ではないと考えています。

nanaka2223
質問者

補足

といいますか私は教科書もなければ師事する先生もいないのでCGIを作って完成させたとしても 私から見れば正常なプログラムでももしかしたら「おかしなプログラム」を作っている可能性は十分ありえる。 その点はCGIを作る時に常に考えてますよ。 何せちゃんと動いてるのかわからないですからね。 そのため、サーバー管理会社は使いません。迷惑をかける可能性が少しでもあるから そのため多額な賠償請求もされません。 私が使うのは自宅サーバーですよ。 ですから、壊れたとしても自業自得ですみますよ。 それにPCはすでに壊れてますしね。 それに私がどんな考え方だとしても。 C言語を使って楽しむのは非常に面白いのですよ。 皆さんが何の理由でC言語を使っているのかは分かりません。 仕事のため、プログラムの勉強のため等さまざまな理由でしょう。 私はC言語を使って楽しみたいからと言うのも理由であれば少しづつ目的となるプログラムを作っていくのが面白いのです。 材料が全くなくてもできますしね。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>1が必須の理由が分からないです。 >なぜなのでしょうか?(長さを指定しなくても動いたので) バッファオーバーランを実施することができるから…です。 現在は20バイト確保していますが、そこに200文字読み込ませることもできます。 未指定ですからね。 そして、あふれたデータがどこに書き込まれるのか? ということです。 # セキュリティホール関係で「バッファオーバーランにより任意のコードが実行できる云々」というのはそういうモノです。 まぁ、そういう意味ではNo.1での私の回答もバッファオーバーランできるのですが。

nanaka2223
質問者

補足

おやよく見たらお久しぶりです♪ 元気そうで何よりですね もうしばらくしたらクリスマスですよ おいしいご飯が楽しみです。 Wr5さんもクリスマスはたのしみますか? 世間話はここまでにして、バッファオーバーランをここで聞く事になるとはおもいませんでした なるほどです。 一定数の文字以上になったら禁止にしていたので気づきませんでした。 (練習用には書いてませんが) あふれたデータ云々はよくわからないようなことになりそうなら、プログラムとして問題ないなら放置。 バグがでてきたらその時処理するでしょうね。 ただ、こう書くとバグになるでしょうっと思っていたものが書いた後は正常に動く事もあって面白いですよね

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

読み込み方法そのものは同じです ・fscanf( fp, "%s %s",nameを一時的に読み込む領域のポインタまたは配列,mbを一時的に読み込む領域のポインタまたは配列 ); ・構造体のname,mbに、上記で読んだ内容を反映させる struct info の場合、name,mbをそのまま「一時的に読み込む領域」として利用する方法もあります。それがそこに書かれているプログラムです。 それで、それぞれの構造体と、そのメンバーはどんな使い方をしたいのですか? たとえばinfo2。 infoでのcharの配列をポインタにしてます。 ポインタは、対象へのアドレスでしかありません。fscanfで読み込むなら、別途その内容を記憶する領域が必要です。 その領域をどう用意するつもりなのでしょうか? ・mallocで動的に確保 ・記憶用の大きな配列を用意して、その一部を使う ・記憶用info構造体を用意して、各メンバーへのポインタにする それぞれに使い方が違います。 info3に至っては、なんでこんな構造体のデザインにしたのかがわかりません。 ファイルは1行にnameとmbで1セットで、それが6行ある、ってことですよね? それなら、infoの配列とか、info2の配列にするのが自然でしょう。

nanaka2223
質問者

補足

<<それで、それぞれの構造体と、そのメンバーはどんな使い方をしたいのですか? ええっとこれは練習用のプログラムなのですが本当に作りたいプログラムは ・ログイン名、IP、リモートホストの3っつを記録して ・ログアウトしたら、記録から内容を消して ・『その内容を読み込んでログイン名のみ表示させる』 プログラムを作りたかったのです。 2番目の処理も苦戦中ですが、今回聞いてるのは3番目の処理をするときにどうしたらいいかの処理ですね <<・mallocで動的に確保 ・記憶用の大きな配列を用意して、その一部を使う ・記憶用info構造体を用意して、各メンバーへのポインタにする それぞれに使い方が違います。 ですので、こう聞かれてるのですが幸いmallocならある程度使った事があるので1番目で記述する方法はある程度分かります 2番目や3番目がどういったものか分からないのですが、作りたいプログラムが無事できるのであれば2番目や3番目の方法で書くこっとも考えます。(ただあんまり知らない方法や関数で書かれると分からなくなるので1番目の方法で書くつもりではあります) <<info3に至っては、なんでこんな構造体のデザインにしたのかがわかりません。 ファイルは1行にnameとmbで1セットで、それが6行ある、ってことですよね? それなら、infoの配列とか、info2の配列にするのが自然でしょう。 その理由はあくまでこのプログッラムが練習用であることとinfo2とinfo3がもしかしたら書き方がぜんぜん違う可能性を考えて質問しましたし、処理の仕方の2番目でそこらへんを知っておくとうまく処理の方法を思いつくのではないかと思って質問しました。 他にも私のプログラムの覚え方が特殊だから変な質問をしてると感じるかもしれませんが

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.2

いろいろ、考え方がおかしいです。変数の使い方も、scanfの使い方も。ついでに、「データ」のスペルも。 1. fscanfの %s では長さ指定が必須 2. char * のようなポインタ宣言した変数を使って文字列を扱うためには、mallocでメモリを割り当てる必要がある

nanaka2223
質問者

補足

教えていただいた 1が必須の理由が分からないです。 なぜなのでしょうか?(長さを指定しなくても動いたので)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイル読込時に構造体の文字列ポインタに割当てたいと

    ファイル読込時に構造体の文字列ポインタに割当てたいと思っています。 (new 演算子を使用します。) 文字列の長さが不定です。 どうすれば、文字列の長さを知ることができますか? 以下のようなところまでは作れましたが、 困っています。 void loaddata()のfscanf関数の部分です。 ほかにも関数の void outputdata() void deletedata() がありますが、長いので省略しました。 ********************************************************** #include<stdio.h> #include<string.h> class data { public: struct basic { char *name; int age; struct basic *next; }; private: struct basic *base; struct basic *base_top; int cnt; public: data::data() { cnt=0; } void inputdata(char *name,int age) { if(cnt==0) { base=new basic; base_top=base; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } else { base->next=new basic; base=base->next; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } } void savedata() { base=base_top; FILE *fp; fp=fopen("dat.txt","w"); for(int i=0;i<cnt;i++) { fprintf(fp,"%s\t%d\n",base->name,base->age); base=base->next; } fclose(fp); } void loaddata() { if(cnt!=0){deletedata();} cnt=0; FILE *fp; fp=fopen("dat.txt","r"); while(1) { fscanf(fp,"%s\t%d\n",base->name,base->age); } } };

  • fscanfを使った読み取り

    datファイルの内容が 100,KAWAI YOSIKI,299,AKASAKA NOBORU・・・・ のような感じになっていて その中身を構造体配列に格納したい場合についてお聞きしたいです。 構造体の型は struct date { int id; char name[80]; }; のような感じです。自分なりに考えてfscanfを使って(省略部分あり) struct o_kaiin[20]; fp=fopen("date.dat","rb"); for(i=0;i<20;i++) { fscanf(fp,"%d%s",&o_kaiin[i].id,&o_kaiin[i].name); } という感じで格納しようとしたのですが、エラーが起こってしまいます。 名前の間に空白が無ければ問題ないのですが、このような文字列の場合 どのようにして読み込めばいいのでしょうか?ご教授ください。

  • fscanfで格納された変数がおかしいです。

    fscanfで格納された変数がおかしいです。 ダブルポインタで定義した変数にfscanfでファイルから文字列データを読み込んでいるのですが 表示がおかしな事になっています。 読み込んだファイルの内容は、 aiueo kakikueko sasisuseso tatituteto です。 表示された結果が kakikueko sasisuseso tatituteto kakisasitatituteto sasitatituteto tatituteto 自分では解決しずらいのでここで質問をさせて頂くことになりました。 C/C++で記述してあるのですが、以下にソースを載せておきますのでご指摘ください。 /* double pointa */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 256 char** size; // TEST void test(void) { for(int l = 0; l < 3; l++) { printf("\n%s", &size[l]); } } int main() { FILE* fp; int c = -1; char moji[MAXSIZE]; if((fp = fopen("test.txt","rb")) == NULL) { printf("error"); exit(1); } while(fscanf(fp,"%s",moji) != EOF) c++; size = (char**)malloc(sizeof(char) * MAXSIZE * c); // 初めに戻す fseek(fp, 0, SEEK_SET); // 最初の文だけ取り出す fscanf(fp,"%s",moji); // 一文を格納する for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) { printf("\n%s", &size[l]); } printf("\n"); test(); fclose(fp); getchar(); free(size); return 0; } test関数内で表示するとおかしな結果がでるのですが何故かわかりません。 よろしくお願いします。

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • fscanfの使い方

     現在C言語の勉強をしているのですが、ファイル入力のfscanfの使い方がいまいちわかりません。  テキストファイル「TEST4K01.txt」には 「A01MATSUMOTO 090075100」が入ってるのですが、それぞれ構造体に直接振り分けて格納したい為fscan関数を使って下のソースを書いたのですがコンパイルするといつも以上終了してしまいます。大変申し訳ないのですが、誰か助言を御願いします。 #include<stdio.h> #include<stdlib.h> struct score { char clas_i; char num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; FILE *ifp; int main(void) { struct score dt; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%1c%2d%10c%3d%3d%3d\n", &dt.clas_i, &dt.num_i, &dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); printf("%s", dt.clas_i); printf("%d", dt.num_i); printf("%s", dt.name); printf("%d", dt.eigo_i); printf("%d", dt.sugaku_i); printf("%d", dt.kokugo_i); fclose(ifp); return 0; }

  • ファイル操作やポインタ、構造体について(C言語)

    C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。 コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。 データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct student{ int id; char name[25]; int gp; int credit; }; void add(char *, struct student);//追加 int search(char *, struct student *);//検索 void change(char *, struct student);//指定したidの学生の情報を変更 main(int argc,char *argv[]) { FILE *fp; int i = 0; int num; struct student students; if(argc == 1){ printf("set filename\n"); return 1; } while(1) { printf("1)add 2)search 0)quit "); scanf("%d",&num); if(num == 0) break; /* 追加 */ if(num == 1) { printf("id name gp credit ? "); scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit); add(argv[1], students); } /* 検索 */ if(num == 2) { printf("id ? "); scanf("%d", &students.id); if(search(argv[1],&students)){ printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit); } else{ printf("ID %d Not Found.\n",students.id); } } if(num == 3){ //変更 } } } /* 追加ルーチン */ void add(char *filename, struct student students) { FILE *fp; if((fp = fopen(filename, "a")) == NULL){ printf("can't open %s\n", filename); exit(1); } fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit); fclose(fp); } /* 検索ルーチン */ int search(char *filename, struct student *students) { FILE *fp; int id; char name[25]; int gp; int credit; if((fp = fopen(filename, "r")) == NULL){ printf("can't open %s\n", filename); exit(1); } while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) { if(id == students->id){ students->id = id; strcpy(students->name ,name); students->gp = gp; students->credit = credit; return 1; } } return 0; fclose(fp); } /* 変更ルーチン */ void add(char *filename, struct student students){ } ------------ここまで------------ ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、 指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは void change(char *, struct student); となっていて、どうやるのかまったく見当もつきません。 稚拙な文で伝わりにくいかもしれませんが、 変更のやり方についてご教授願います。 見難くて申し訳ありません。 どうか宜しくお願いします。

  • 構造体の配列について

    --------------------------------------------------- #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)の部分もよくイメージがわきません。 以上、どのような仕組みになっているのか教えていただければ嬉しいです。

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • 構造体内のポインタのポインタについて

    ポインタを理解するために以下のようなテストプログラムを作りました。 test.h --- typedef struct i_info{ int i_id; char i_name[64]; } I_INFO; typedef struct j_info{ int j_id; char j_name[64]; } J_INFO; typedef struct k_info{ int k_id; char k_name[64]; } K_INFO; typedef struct info{ int id; char name[64]; I_INFO iinfo; J_INFO *jinfo; K_INFO **kinfo; } INFO; --- test.c --- 1 #include <stdlib.h> 2 #include <stdio.h> 3 #include "./test.h" 4 5 int main(int argc, char **argv) 6 { 7 INFO info; 8 J_INFO j; 9 K_INFO k; 10 K_INFO *pk=NULL; 11 12 memset (&info,NULL,sizeof(info)); 13 memset (&j,NULL,sizeof(j)); 14 memset (&k,NULL,sizeof(k)); 15 16 info.id = 1; 17 memcpy(info.name,"***",3); 18 19 info.iinfo.i_id = 2; 20 memcpy(info.iinfo.i_name,"*i*",3); 21 22 info.jinfo = &j; 23 j.j_id = 3; 24 memcpy(j.j_name,"*j*",3); 25 26 info.kinfo = &pk; 27 pk= &k; 28 k.k_id = 4; 29 memcpy(k.k_name,"*k*",3); 30 31 printf( "%d\n",info.id); 32 printf( "%s\n",info.name); 33 printf( "%d\n",info.iinfo.i_id); 34 printf( "%s\n",info.iinfo.i_name); 35 printf( "%d\n",info.jinfo->j_id); 36 printf( "%s\n",info.jinfo->j_name); 37 /* 38 printf( "%d\n",info.kinfo->k_id); 39 printf( "%s\n",info.kinfo->k_name); 40 */ 41 } --- 38,39行目をコメントアウトするとコンパイルは通るのですが、 そのままだとコンパイルエラーになります。 なぜいけないのでしょうか?理由を教えてください。

  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。