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

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

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

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

Q&A

解決済

4回答

2642閲覧

構造体のポインタ配列によるエラーから抜け出せない

urazome

総合スコア26

C

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

0グッド

0クリップ

投稿2019/05/06 08:48

標準入力からファイル名を入力して、そのファイルのデータを読み込み、ポインタ配列にデータを格納します。その後、別のファイルに先ほど格納したデータを書き込み、出力できれば成功です。
ファイルのデータはポインタ配列に格納し、且つ、利用する分だけ動的にメモリを確保することが条件です。

次の4行が読み込むデータです。
JZK-30 Jizake_tsumeawase 4500
BSP-15 Body_soap_set 3000
BT-200 Bath_towel_set 2500
TEA-20 Koutya_tsumeawase 5000

そして以下のコードを作成したのですが、
"request for member '(構造体のメンバ)' in something not a structure or union"というエラーが表示されます。
(エラーが起きたところにエラーを書きました。)
しかし、何が足りないのかわかりません。。。ご教授頂けると助かります!

c言語

1#include<stdio.h> 2#include <stdlib.h> 3#include<string.h> 4#define MAX 4 5 6struct gift{ 7 char code; 8 char name; 9 int price; 10}; 11 12int main(void) 13{ 14 int num,i,k; 15 char ref[256]; 16 int fprice[MAX][256]; //一時保管場所 17 char fname[MAX][256], fcode[MAX][256];  //一時保管場所 18 19 FILE *fp; 20 FILE *file; 21 22 printf("データ数を入力してください:"); 23 scanf("%d",&num); 24 printf("ファイル名を指定して下さい:"); 25 scanf("%s",ref); 26 27 28 struct gift *gifts[num]; 29 30 for(i=0;i<MAX;i++){ 31 32 fp=fopen(ref,"r"); 33 if(fp==NULL){ 34 printf("%s ファイルが開けません\n",ref); 35 exit(1); 36 } 37 38 fscanf(fp,"%s %s %d",fcode[i],fname[i],fprice[i]); //一時保管場所に保管 39 40 k=0; 41 while(fprice[i][k]){ 42 k++; 43 } 44 45//ここから動的メモリ確保をします 46 (gifts+i)->code=(char*)malloc(sizeof(char)*strlen(fcode[i]));  //エラーrequest ~ 'code' in ~ 47 (gifts+i)->name=(char*)malloc(sizeof(char)*strlen(fname[i])); //エラーrequest ~ 'name' in ~ 48 (gifts+i)->price=(int*)malloc(sizeof(int) * k+1); //エラーrequest ~ 'price' in ~ 49 50//コピー 51 srcpy((gifts+i)->code,fcode[i]); //エラーrequest ~'code' in ~ 52 srcpy((gifts+i)->name,fname[i]); //エラーrequest ~'name' in ~ 53 srcpy((gifts+i)->price,fprice[i]);  //エラーrequest ~'price' in ~ 54 55 fclose(fp); 56 57 file=fopen("present.txt","w"); 58 fprintf(file,"%s\n%s\n%d\n",(gifts+i)->code,(gifts+i)->name,(gifts+i)->price);   59 //エラーrequest ~'code' in ~  //エラーrequest ~'name' in ~  //エラーrequest ~'price' in ~ 60 61 fclose(file); 62 63 free((gifts+i)->code);  //エラーrequest ~'code' in ~ 64 free((gifts+i)->name);  //エラーrequest ~'name' in ~ 65 free((gifts+i)->price);  //エラーrequest ~'price' in ~ 66 } 67 68 69 puts("表示形式変換後ファイルに出力しました。"); 70 71 return 0; 72}

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

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

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

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

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

guest

回答4

0

ベストアンサー

...なんかダメダメやね。
そのものヅバリを呈示するから よーく読んで理解して。
すべての処理をmain一本に詰め込むのは悪い癖だ。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <assert.h> 5 6struct gift { 7 char* code; 8 char* name; 9 int price; 10}; 11 12// 与えられたcode/name/priceを基にgiftを生成する 13struct gift* gift_create(const char* code, const char* name, int price) { 14 struct gift* result = (struct gift*)malloc(sizeof(struct gift)); 15 assert( result != NULL ); 16 result->code = strdup(code); assert(result->code != NULL); 17 result->name = strdup(name); assert(result->name != NULL); 18 result->price = price; 19 return result; 20} 21 22// giftを廃棄する 23void gift_destroy(struct gift* pgift) { 24 assert(pgift != NULL); 25 free(pgift->code); 26 free(pgift->name); 27 free(pgift); 28} 29 30// ファイルから読みこまれた一行(line)を基にgiftを構築する 31struct gift* gift_build(char* line) { 32 char* code; 33 char* name; 34 int price; 35 char* ctx; 36 assert(line != NULL); 37 code = strtok_s(line, " ", &ctx); 38 name = strtok_s(NULL, " ", &ctx); 39 price = atoi(strtok_s(NULL," ", &ctx)); 40 return gift_create(code, name, price); 41} 42 43/* 44 * main 45 */ 46 47#define MAX 4 48 49int main() { 50 51 struct gift* gifts[MAX]; 52 int num; 53 54 { // ファイルを呼んでgiftsを構築する。データ数(最大MAX個)をnumに求める 55 FILE *fp; 56 char line[256]; 57 58 printf("ファイル名を指定して下さい:"); 59 scanf("%s",line); 60 61 fp = fopen(line, "r"); 62 if(fp==NULL){ 63 printf("%s ファイルが開けません\n",line); 64 exit(1); 65 } 66 67 num = 0; 68 while ( fgets(line, 256, fp) ) { 69 gifts[num++] = gift_build(line); 70 if ( num == MAX ) break; 71 } 72 fclose(fp); 73 } 74 75 { // giftsを出力。ファイルに書き出したいなら好きにしろ 76 int i; 77 for ( i = 0; i < num; ++i ) { 78 printf("code[%s] name[%s] price[%d]\n", gifts[i]->code, gifts[i]->name, gifts[i]->price); 79 } 80 } 81 82 { // あとしまつ 83 int i; 84 for ( i = 0; i < num; ++i ) { 85 gift_destroy(gifts[i]); 86 } 87 } 88 89 return 0; 90}

投稿2019/05/06 11:43

編集2019/05/06 11:46
episteme

総合スコア16614

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

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

urazome

2019/05/14 14:17

お忙しいところ、わざわざコードを見直していただきありがとうございます。大変勉強になりました!
guest

0

(gifts+i)->code 宣言を見ると、struct gift *gifts[num] なんで、struct giftへのポインタ配列。実体が無いので、まずは、その実体の確保から。

で、code=(char*)malloc() この部分も、左側が char に対し、右側が、(char *) なので不一致。 こちらは、struct gistの宣言の見直しが必要かと思います。

VS2019でコンパイルしたら、他にも色々と警告されましたが、まずはこの辺でしょうか。 (警告の一部は、コンパイラオプションの問題ですが)

投稿2019/05/06 09:12

pepperleaf

総合スコア6383

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

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

urazome

2019/05/14 14:18

恐縮です。助言ありがとうございます!
guest

0

(gifts+i)->code=(char*)malloc(sizeof(char)*strlen(fcode[i]));  //エラーrequest ~ 'code' in ~

gift の中身が存在しません。
(gifts+i)ってなにを指してるのか考えてみればどうでしょう

投稿2019/05/06 08:54

y_waiwai

総合スコア87774

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

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

urazome

2019/05/14 14:19

はい!ありがとうございます!
guest

0

結局、以下のコードで通してもらえました。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define MAX 256 6 7 struct gift{ 8 char code[MAX]; 9 char name[MAX]; 10 int price; 11}; 12 13int main(void) 14{ 15 int num,i,len; 16 char ref[256];//="gifts.dat"; 17 int fprice; 18 char fname[256], fcode[256]; 19 20 FILE *fp; 21 FILE *file; 22 23 24 25 26 printf("データ数を入力してください:"); 27 scanf("%d",&num); 28 printf("ファイル名を指定して下さい:"); 29 scanf("%s",ref); 30 31 32 struct gift *gifts=(struct gift*)malloc(num * sizeof(struct gift)); 33 34 fp=fopen(ref,"r"); 35 if(fp==NULL){ 36 printf("%s ファイルが開けません\n",ref); 37 exit(1); 38 } 39 40 for(i=0;i<num;i++){ 41 42 fscanf(fp,"%s %s %d",fcode,fname,&fprice); 43 //fscanf(fp,"%s ",gifts->code); 44 45 //printf("%s %s %d\n",fcode,fname,fprice); 46 //printf("%s\n", fcode); 47 48 strcpy((gifts+i)->code,fcode); 49 strcpy((gifts+i)->name,fname); 50 (gifts+i)->price=fprice; 51 52 //printf("%s \n",(gifts+i)->code); 53 //++gifts; 54 } 55 fclose(fp); 56 57 file=fopen("present.txt","w"); 58 for(i=0;i<num;i++){ 59 fprintf(file,"code:%s\nname:%s\nprice:%d\n\n",(gifts+i)->code,(gifts+i)->name,(gifts+i)->price); 60 //printf("%s\n",gifts->code); 61 62 //++gifts; 63 //free((gifts+i)->code); 64 //free((gifts+i)->name); 65 // free((gifts+i)->price); 66 } 67 fclose(file); 68 69 free(gifts); 70 puts("表示形式変換後ファイルに出力しました。"); 71 72 73 return 0; 74}

投稿2019/05/14 14:23

urazome

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問