前提・実現したいこと
c言語でスタックの実現をしようとしています。
ファイルからデータをスタックに格納するところまではできたのですが、スタックからデータをブッシュするのがうまくいきません。
発生している問題・エラーメッセージ
Pop関数をソースファイル内で使うとデータ文字列で読み込んだ最後の配列のみをスタックの容量分だけポップしてしまいます。
アクセス違反が発生してしまっています。
stack.exe の 0x0f73d540 (msvcr100d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました。 ### 該当のソースコード ```c ソースコード
#include <stdio.h>
#include "mystack.h"
int main(void)
{
char buffer[128];
char *data[100];
struct student *seito[100];
int i = 0;
int j = 0;
FILE *fpin;
CharStack s;
if(Initialize(&s,64) == -1)
{
puts("スタックの生成に失敗しました");
return 1;
}
fpin = fopen( "input.txt", "r");
if(fpin == NULL)
{
fprintf(stderr,"入力するファイルがオープンできません");
return 0;
}
while(fgets(&buffer[0], sizeof(buffer),fpin) != NULL)
{
//スタックに代入
if(Push(&s, &buffer[0]) == -1)
{
puts("ブッシュに失敗しました");
break;
}
printf("%d\n",Size(&s));
printf("%s\n",s.stk[i]);
i++;
//100人を超えたら読み込みを終了
if(i>99)
{
break;
}
} while(1) { if(Pop(&s,data[j]) == -1) { puts("ポップ終了"); break; } printf("%s\n",s.stk[j]); printf("%d\n",Size(&s)); j++; } //ファイルを閉じる fclose(fpin); set_data_student(&data[0],&seito[0],j); Terminate(&s); return 0;
}
#ifndef MYSTACK_H #define MYSTACK_H #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_LENGTH 128 typedef struct { int max; //スタックのサイズ int ptr; //スタックのポインタ char **stk; //スタック(の先頭要素へのポインタ) } CharStack; struct student { char name[12]; int math; int eng; }; /*--- スタックの初期化 ---*/ int Initialize(CharStack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(char *))) == NULL) { s->max = 0; /* 配列の生成に失敗 */ return -1; } s->max = max; return 0; } /*--- スタックの後始末 ---*/ void Terminate(CharStack *s) { if (s->stk != NULL) free(s->stk); /* 配列を破棄 */ s->max = s->ptr = 0; } /*--- スタックにデータをプッシュ ---*/ int Push(CharStack *s, char *x) { if (s->ptr >= s->max) /* スタックは満杯 */ return -1; s->stk[s->ptr++] = x; return 0; } /*--- スタックからデータをポップ ---*/ int Pop(CharStack *s, char *x) { if (s->ptr <= 0) /* スタックは空 */ return -1; x = s->stk[--s->ptr]; return 0; } int Size(const CharStack *s) { return s->ptr; } //struct student構造体オブジェクトのメンバに値を格納する関数 struct student *set_student(char *n, int m, int e) { struct student *ps = NULL; ps = (struct student*)malloc(1 * sizeof(struct student)); if(ps == NULL) { puts("記憶域の確保に失敗しました"); return NULL; } strcpy(ps->name, n); ps->math = m; ps->eng = e; return ps; } /*--データ文字列から数値や文字列にデータ変換をし構造体にまとめて管理する関数--*/ void set_data_student(char *data[], struct student *seito[],int length) { char n[12]; int m,e,i; for(i=0;i<length;i++) { sscanf(data[i],"%s%d%d",n,&m,&e); seito[i] = set_student(n,m,e); } } ### 試したこと ブレイクポイントを使ったところエラーはset_data_studentで起きているようでした。 ### 補足情報(FW/ツールのバージョンなど) visual C++ 2010 を使いました
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/19 08:14 編集
2018/06/19 08:22
2018/06/19 13:39