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

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

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

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

Q&A

解決済

2回答

2182閲覧

C言語 スタック 一組の文字列を一スタックとしたい

junnnnchan

総合スコア26

C

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

0グッド

1クリップ

投稿2020/06/01 07:54

編集2020/06/01 08:26
#include <stdio.h> #define MAX 10 /*--- int 型スタックを実現する構造体 ---*/ /*--- 身体データ型 ---*/ typedef struct{ int height; /* 身長 */ double vision; /* 視力 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ Body body; /* 身体データ型 ---*/ int ptr;/* スタックポインタ */ int max; int stk[MAX]; char name[20]; /* 氏名  20人分の箱*/ } PhysCheckStack ; /*--- スタックの初期化 ---*/ int Initialize(PhysCheckStack *s, int max){ s->ptr = 0; s->max = max; //s->max = ( sizeof s->name / sizeof s->name[0]); return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(PhysCheckStack *s, char x[]){ if (s->ptr >= s->max) return -1; /* スタック満杯 */ for(int i = 0 ; x[i] != NULL ; i ++){ s->name[s->ptr] = x[i]; s->ptr++; } return 0; } // /*--- スタックからデータをポップ ---*/ // int Pop(PhysCheckStack *s, int *x){ // if (s->ptr <= 0) return -1; /* スタックは空 */ // s->ptr--; // *x = s->stk[s->ptr]; // return (0); // } // /*--- スタックからデータをピーク ---*/ // int Peek(PhysCheckStack *s, int *x){ // if (s->ptr <= 0) return -1; // *x = s->stk[s->ptr - 1]; // return 0; // } /*--- スタックの容量 ---*/ int Capacity(const PhysCheckStack *s){ return s->max; } // /*--- スタックに積まれているデータ数 ---*/ int Size(const PhysCheckStack *s){ return ; } /*--- スタックの全データの表示 ---*/ void Print(const PhysCheckStack *s){ for(int i = 0; s->name[i] != NULL; i++) { printf("%s", s->name[i]); } putchar('\n'); } int main(void){ PhysCheckStack s; Initialize(&s, MAX); while (1) { int menu; char y[20]; printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s)); printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* プッシュ */ printf("データ:"); scanf("%s", y); if (Push(&s, y) == -1) puts("\a エラー:プッシュに失敗しました。"); break; // case 2: /* ポップ */ // if (Pop(&s, &x) == -1) // puts("\a エラー:ポップに失敗しました。"); // printf("ポップしたデータは%d です。\n", x); // break; // case 3: /* ピーク */ // if (Peek(&s, &x) == -1) // puts("\a エラー:ピークに失敗しました。"); // else // printf("ピークしたデータは%d です。\n", x); // break; case 4: /* 表示 */ Print(&s); break; } } return 0; }

開発途中段階です
1.プッシュで入力をabcとしたとき、現在のデータ数は1/10としたい
2.Print(&s);を呼び出したとき、abcと表示させたい

この解決プロセスについてアドバイスをよろしくお願いします。

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

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

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

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

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

maisumakun

2020/06/01 07:55

今のコードだと、どのような問題があるのでしょうか。 (あと、インデントがなくて見づらいので追加していただければと思います)
junnnnchan

2020/06/01 08:06

試行錯誤して出た値が、core dumpと出ました
y_waiwai

2020/06/01 08:15

> 現在のデータ数は1/10としたい ってのが意味わかりませんが、どういうことでしょうか
fana

2020/06/01 08:18

Size()がまともに実装されてないように見えますが…?
guest

回答2

0

ベストアンサー

これでいい?

C

1#define _CRT_SECURE_NO_WARNINGS /* disable warning for VC++ */ 2#include <stdio.h> // printf, puts, scanf 3#include <stdlib.h> // malloc, free 4#include <string.h> // strlen, strcpy 5#include <assert.h> 6 7char* string_duplicate(const char* str) { 8 char* p = (char*)malloc(strlen(str)+1); 9 if ( p ) strcpy(p, str); 10 return p; 11} 12 13typedef struct { 14 int max; 15 int ptr; 16 char** stk; 17} PhysCheckStack; 18 19/*--- スタックの初期化 ---*/ 20int Initialize(PhysCheckStack* s, int max) { 21 assert( s != NULL); 22 assert( max > 0 ); 23 s->stk = (char**)malloc(sizeof(char*) * max); 24 if ( s->stk == NULL ) return -1; 25 s->ptr = 0; 26 s->max = max; 27 return 0; 28} 29 30/*--- スタックにデータをプッシュ ---*/ 31int Push(PhysCheckStack* s, const char* x) { 32 assert(s != NULL); 33 assert(x != NULL); 34 if (s->ptr >= s->max) return -1; /* スタック満杯 */ 35 s->stk[s->ptr] = string_duplicate(x); 36 s->ptr++; 37 return 0; 38} 39 40int Pop(PhysCheckStack *s, char** x) { 41 assert(s != NULL); 42 assert(x != NULL); 43 if (s->ptr <= 0) return -1; /* スタックは空 */ 44 s->ptr--; 45 *x = s->stk[s->ptr]; 46 return 0; 47} 48 49/*--- スタックからデータをピーク ---*/ 50int Peek(const PhysCheckStack *s, char** x) { 51 assert(s != NULL); 52 assert(x != NULL); 53 if (s->ptr <= 0) return -1; 54 *x = s->stk[s->ptr - 1]; 55 return 0; 56} 57 58/*--- スタックの容量 ---*/ 59int Capacity(const PhysCheckStack* s) { 60 assert(s != NULL); 61 return s->max; 62} 63 64// /*--- スタックに積まれているデータ数 ---*/ 65int Size(const PhysCheckStack* s) { 66 assert(s != NULL); 67 return s->ptr; 68} 69 70/*--- スタックの全データの表示 ---*/ 71void Print(const PhysCheckStack* s) { 72 assert(s != NULL); 73 for (int i = 0; i < s->ptr; ++i ) { 74 printf("%s ", s->stk[i]); 75 } 76 putchar('\n'); 77} 78 79/*--- スタックの廃棄 ---*/ 80void Terminate(PhysCheckStack* s) { 81 assert(s != NULL); 82 while ( Size(s) > 0) { 83 char* x; 84 Pop(s, &x); 85 free(x); 86 } 87 free(s->stk); 88} 89 90int main(void) { 91 PhysCheckStack s; 92 Initialize(&s, 10); 93 while (1) { 94 int menu; 95 char y[20]; 96 char* x; 97 printf("現在のデータ数:%d/%d\n", Size(&s), Capacity(&s)); 98 printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (0) 終了:"); 99 scanf("%d", &menu); 100 if (menu == 0) break; 101 switch (menu) { 102 case 1: /* プッシュ */ 103 printf("データ:"); 104 scanf("%s", y); 105 if (Push(&s, y) == -1) 106 puts("\a エラー:プッシュに失敗しました。"); 107 break; 108 case 2: /* ポップ */ 109 if (Pop(&s, &x) == -1) 110 puts("\a エラー:ポップに失敗しました。"); 111 printf("ポップしたデータは%s です。\n", x); 112 free(x); 113 break; 114 case 3: /* ピーク */ 115 if (Peek(&s, &x) == -1) 116 puts("\a エラー:ピークに失敗しました。"); 117 else 118 printf("ピークしたデータは%s です。\n", x); 119 break; 120 case 4: /* 表示 */ 121 Print(&s); 122 break; 123 } 124 } 125 Terminate(&s); 126 return 0; 127}

投稿2020/06/02 01:34

編集2020/06/02 03:03
episteme

総合スコア16612

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

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

junnnnchan

2020/06/02 03:21

ありがとうございます! epstemeさんがこのコードを思いついた思考法を知りたいです。 ふだんどのように思考してプログラムを記述していますか?
episteme

2020/06/02 03:24

ろくすっぽ考えていません。(頭の中にある)定石/手駒をかき集めて所望の動作を組み立ててるだけ。
junnnnchan

2020/06/02 03:27

そうなんですか! 最初は頭の中の定石を増やす作業をしたほうが良いのでしょうか?
episteme

2020/06/02 03:30

人によりけりじゃないかしら。 てか、定石なんてものはおベンキョしてるうちに自然と溜まるもんでしょ。 溜まってないとしたら、おベンキョしてない/考えてない/身に付いてないってことじゃないかしらね。
junnnnchan

2020/06/02 03:38

もっと時間をかけて勉強すべきということですね! ありがとうございました。
guest

0

C

1 for(int i = 0 ; x[i] != NULL ; i ++){ 2 s->name[s->ptr] = x[i]; 3 s->ptr++; 4 } 5

s->nameはいったいなんなのか考えてみよう
添字の意味は?

投稿2020/06/01 08:19

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問