前提・実現したいこと
C言語でスタックを実現する関数を作っています
2回Push関数でスタック内にデータを入れて、Print関数でスタック内を見てみると1回目に入れたはずのデータも2回目に入れたデータ置き換わってしまいます。
発生している問題・エラーメッセージ
なし
該当のソースコード(main関数)
C
1#include <stdio.h> 2#include "mystack.h" 3 4int main(void) 5{ 6 int menu; 7 char *data[100]; 8 struct student *seito[100]; 9 char n[16]; 10 int m,e; 11 int i=0; 12 CharStack s; 13 14 if (Initialize(&s, 64) == -1) { 15 puts("スタックの生成に失敗しました。"); 16 return 1; 17 } 18 19 while (1) { 20 char x[48],x1[16],x2[16],x3[16]; 21 printf("現在のデータ数:%d / %d\n", Size(&s), Capacity(&s)); 22 printf("(1)プッシュ \n(2)ポップしてデータベースに格納 (3)データベースの値を表示 (4)スタック内表示 (0) 終了:"); 23 scanf("%d", &menu); 24 25 if (menu == 0) break; 26 27 switch (menu) { 28 case 1: /*--- プッシュ ---*/ 29 printf("データ:"); 30 scanf("%s %s %s", x1,x2,x3); 31 sprintf(x,"%s %s %s",x1,x2,x3); 32 if (Push(&s, x) == -1) 33 puts("\aエラ-:プッシュに失敗しました。"); 34 break; 35 36 case 2: /*--- ポップしてデータベースに格納 ---*/ 37 if (Pop(&s, &data[i]) == -1) 38 puts("\aエラ-:ポップに失敗しました。"); 39 else 40 printf("ポップしたデータは%sです。\n", data[i]); 41 //ポップしたデータを文字列と数値に変換 42 sscanf(data[i],"%s%d%d",n,&m,&e); 43 //構造体の配列に格納 44 seito[i] = set_student(n,m,e); 45 i++; 46 break; 47 /*---データベースの値を表示---*/ 48 case 3: 49 print_all_student(seito,i); 50 break; 51 case 4: 52 Print(&s); 53 } 54 } 55 56 Terminate(&s); 57 58 return 0; 59} 60 61 62### 使用したヘッダファイル内の関数 63```C 64#ifndef MYSTACK_H 65#define MYSTACK_H 66 67#include <stdio.h> 68#include <stdlib.h> 69#include <string.h> 70 71typedef struct 72{ 73 int max; //スタックのサイズ 74 int ptr; //スタックのポインタ 75 char **stk; //スタック(の先頭要素へのポインタ) 76} CharStack; 77 78struct student 79{ 80 char name[12]; 81 int math; 82 int eng; 83}; 84/*--- スタックの初期化 ---*/ 85int Initialize(CharStack *s, int max) 86{ 87 s->ptr = 0; 88 if ((s->stk = calloc(max, sizeof(char *))) == NULL) { 89 s->max = 0; /* 配列の生成に失敗 */ 90 return -1; 91 } 92 s->max = max; 93 return 0; 94} 95/*--- スタックの後始末 ---*/ 96void Terminate(CharStack *s) 97{ 98 if (s->stk != NULL) 99 free(s->stk); /* 配列を破棄 */ 100 s->max = s->ptr = 0; 101} 102/*--サイズ確認--*/ 103int Size(const CharStack *s) 104{ 105 return s->ptr; 106} 107/*--- スタックにデータをプッシュ ---*/ 108int Push(CharStack *s, char *x) 109{ 110 if (s->ptr >= s->max) /* スタックは満杯 */ 111 return -1; 112 s->stk[s->ptr++] = x; 113 return 0; 114} 115 116/*--- スタックからデータをポップ ---*/ 117int Pop(CharStack *s, char **x) 118{ 119 if (s->ptr <= 0) /* スタックは空 */ 120 return -1; 121 *x = s->stk[--s->ptr]; 122 return 0; 123} 124/*--- スタックの容量 ---*/ 125int Capacity(const CharStack *s) 126{ 127 return s->max; 128} 129/*--- 全データの表示 ---*/ 130void Print(const CharStack *s) 131{ 132 int i; 133 134 for (i = 0; i < s->ptr; i++) /* 底→頂上に走査 */ 135 printf("%s", s->stk[i]); 136 putchar('\n'); 137} 138 139void print_all_student(struct student *seito[],int ninzu) 140{ 141 int i; 142 for(i=0;i<ninzu;i++) 143 { 144 printf("Name:%s\nMath:%d\nEng:%d\n",seito[i]->name,seito[i]->math,seito[i]->eng); 145 } 146} 147//struct student構造体オブジェクトのメンバに値を格納する関数 148struct student *set_student(char *n, int m, int e) 149{ 150 struct student *ps = NULL; 151 ps = (struct student*)malloc(1 * sizeof(struct student)); 152 if(ps == NULL) 153 { 154 puts("記憶域の確保に失敗しました"); 155 return NULL; 156 } 157 strcpy(ps->name, n); 158 ps->math = m; 159 ps->eng = e; 160 return ps; 161} 162 163#endif
試したこと
Pushを二回行い、スタック内を確認したら問題が発生したので、Pushの関数かmain関数の変数に問題があるのかもしれないということがわかった。
補足情報(FW/ツールのバージョンなど)
visual C++ 2010
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/24 15:55
2018/06/24 16:08
2018/06/25 13:48