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

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

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

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

Q&A

解決済

2回答

1939閲覧

C言語 スタック . と->の違いについて

junnnnchan

総合スコア26

C

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

0グッド

0クリップ

投稿2020/06/05 12:55

#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[s.ptr]); 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);https://www.onlinegdb.com/fork/HyZW3BAi8#tab-stdin break; case 5://探索 scanf("%s",x.name[s.ptr]); int search = Search(&s,&x); if(search == 0){ puts("パターンは存在しません"); } else{ printf("%dパターンあります\n",search); } } } return 0; }

<質問>
case 5のscanf("%s",x.name[s.ptr]);をscanf("%s",x.name[s->ptr]);と表記するとエラーが起こります。
printf("ピークしたデータは%s %.1f %d です。\n", x.name[s.ptr],x.body.vision,x.body.height);のx.name[s.ptr]もx.name[s->ptr]とするとエラーが起こります。
自分は、s.ptrとs->ptrは同じだと解釈していたのですが、なぜエラーになるのかご教示お願いします。

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

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

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

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

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

episteme

2020/06/05 13:15

教本をひととおり読んではいかがか?
guest

回答2

0

自分は、s.ptrとs->ptrは同じだと解釈していたのですが、

全然違います。
s.ptrと書くのは、sがstruct型の変数の時です(あるいはunionもだが今回は無関係)。
s->ptrと書くのは、sがstruct型へのポインタ変数の時です。

投稿2020/06/05 13:02

otn

総合スコア85901

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

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

junnnnchan

2020/06/05 13:10

丁寧にありがとうございます! アロー演算子について勉強しなおします
guest

0

ベストアンサー

自分は、s.ptrとs->ptrは同じだと解釈していたのですが、なぜエラーになるのかご教示お願いします。

同じじゃないから。

PhysCheckStack *s に対し
(*s).ptr と s->ptr は同じだけど。

PhysCheckStack s に対し
s.ptr と (&s)->ptr は同じだけど。

投稿2020/06/05 12:59

編集2020/06/05 13:17
episteme

総合スコア16612

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

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

junnnnchan

2020/06/05 13:21

アロー演算子について勉強しなおしてきます。 丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問