<追記>
#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の警告の解決策がわかりません。
よりよい解決策をご教示お願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/05 11:20
2020/06/05 11:51
2020/06/05 11:52
2020/06/05 12:25