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

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

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

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

Q&A

解決済

1回答

1380閲覧

C言語 Calloc 型

junnnnchan

総合スコア26

C

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

0グッド

0クリップ

投稿2020/06/05 11:09

編集2020/06/05 12:47

<追記>

#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 10 /*--- int 型スタックを実現する構造体 ---*/ typedef struct{ double vision; /* 視力 */ int height; /* 身長 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ Body body; /* 身体データ型 ---*/ char *name[20]; /* 氏名 */ } PhysCheck ; typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ PhysCheck stk[MAX]; /* スタック本体*/ } PhysCheckStack; int Search(PhysCheckStack *s , PhysCheck *x){ int count = 0; for(int i = 0 ; i < s->ptr ; i ++){ if(strcmp(x->name[s->ptr],s->stk[i].name[s->ptr]) == 0){//string compare 文字一致したら0返す printf("%s %f %d\n",s->stk[i].name[s->ptr],s->stk[i].body.vision,s->stk[i].body.height); count ++; } } return count; } /*--- スタックの初期化 ---*/ int Initialize(PhysCheckStack *s, int max){ s->ptr = 0; if ((s->stk[s->ptr].name[s->ptr] = calloc(max, sizeof(char*))) == NULL) { s->max = 0; /* char* の配列の確保に失敗 */ return -1; } s->max = max; return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(PhysCheckStack *s, PhysCheck *x){ if (s->ptr >= s->max) return -1; /* スタック満杯 */ strcpy(s->stk[s->ptr].name[s->ptr],x->name[s->ptr]); if ((s->stk[s->ptr].name[s->ptr] = calloc(strlen(x->name[s->ptr])+1, sizeof(char*))) == NULL) /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */ return -1; s->stk[s->ptr].body.vision = x->body.vision; s->stk[s->ptr].body.height = x->body.height; s->ptr++; return 0; } /*--- スタックからデータをポップ ---*/ int Pop(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; /* スタックは空 */ s->ptr--; strcpy(x->name[s->ptr],s->stk[s->ptr].name[s->ptr]); x->body.vision = s->stk[s->ptr].body.vision; x->body.height = s->stk[s->ptr].body.height; free(s->stk[s->ptr].name[s->ptr]); return (0); } /*--- スタックからデータをピーク ---*/ int Peek(PhysCheckStack *s, PhysCheck *x){ if (s->ptr <= 0) return -1; strcpy(x->name[s->ptr],s->stk[s->ptr-1].name[s->ptr]); x->body.vision = s->stk[s->ptr-1].body.vision; x->body.height = s->stk[s->ptr-1].body.height; return 0; } /*--- スタックの容量 ---*/ int Capacity(const PhysCheckStack *s){ return s->max; } /*--- スタックに積まれているデータ数 ---*/ int Size(const PhysCheckStack *s){ return s->ptr; } /*--- スタックの全データの表示 ---*/ void Print(const PhysCheckStack *s){ int i; for(i = 0; i < s->ptr; i++) printf("%s %f %d", s->stk[i].name[s->ptr],s->stk[i].body.vision,s->stk[i].body.height); putchar('\n'); } int main(void){ PhysCheckStack s; PhysCheck x; Initialize(&s, MAX); while (1) { int menu; printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s)); printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* プッシュ */ printf("データ:"); scanf("%d", &x.body.height); scanf("%s",x.name); scanf("%lf",&x.body.vision); if (Push(&s, &x) == -1) puts("\a エラー:プッシュに失敗しました。"); break; case 2: /* ポップ */ if (Pop(&s, &x) == -1) puts("\a エラー:ポップに失敗しました。"); else printf("ポップしたデータは%s %.1f %d です。\n", x.name[s->ptr],x.body.vision,x.body.height); break; case 3: /* ピーク */ if (Peek(&s, &x) == -1) puts("\a エラー:ピークに失敗しました。"); else printf("ピークしたデータは%s %.1f %d です。\n", x.name[s->ptr],x.body.vision,x.body.height); break; case 4: /* 表示 */ Print(&s); break; case 5://探索 scanf("%s",x.name); int search = Search(&s,&x); if(search == 0){ puts("パターンは存在しません"); } else{ printf("%dパターンあります\n",search); } } } return 0; }

main.c:103:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
main.c:112:41: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
main.c:118:41: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
main.c:124:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]

<質問>
警告を消すには、どう直したらよいでしょうか。
scanfの警告の解決策がわかりません。
よりよい解決策をご教示お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

配列と型が違うという意味らしいですが、理解できません。

配列をポインタとして使うことはできますが、配列は固定して確保されたメモリ領域なので、ポインタを配列に代入することはできません。

投稿2020/06/05 11:14

maisumakun

総合スコア146018

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

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

maisumakun

2020/06/05 11:20

やりたいことは、「s->stk[s->ptr].name」の配列全体を書き換えるのではなく、s->stk[s->ptr].name[0] = calloc()のように、配列に領域確保したポインタを詰めることなのではないでしょうか。
junnnnchan

2020/06/05 11:51

更新しました。 正常に動くのですが、多量の警告文が消えません。。。
maisumakun

2020/06/05 11:52

警告文をよく読んで、正しい型の値を指定しましょう。
junnnnchan

2020/06/05 12:25

更新しました。 更新した内容のエラー文と警告の解決策だけわかりませんでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問