• ベストアンサー

コンパイルできるのですが実行途中でエラーが

#include<iostream> #include<cstdlib> using namespace std; class stack{ char *stck; int tos; int size; public: stack(char c); void push(char ch); char *pop(); ~stack(); }; stack::stack(char c){ tos=0; stck=(char*)malloc(c); size=c; cout<<"生成スタック\n"; if(!stck){ cout<<"メモリ割り当てエラー\n"; exit(1); } } void stack::push(char ch){ if(tos==size){ cout<<"スタックは一杯です\n"; return; } *stck=ch; stck++; tos++; } char *stack::pop(){ if(tos==0){ cout<<"スタックは空です\n"; return 0; } stck--; tos--; return stck; } stack::~stack(){ free(stck); } int main(){ stack s1(10),s2(10); int i; char *o; s1.push('a'); s2.push('x'); s1.push('b'); s2.push('y'); s1.push('c'); s2.push('z'); for(i=0;i<5;i++){ o=s1.pop(); cout<<"s1をポップする"<<*o<<"\n"; } for(i=0;i<5;i++){ o=s2.pop(); cout<<"s2をポップする"<<*o<<"\n"; } return 0; } なんですが、実行した所 生成スタック 生成スタック s1をポップするc s1をポップするb s1をポップするa スタックは空です までで止まってしまいます。 たぶんreturn 0の戻り値の型がポインタだから止まってしまうのだろうと思います。 正しく実行するにはどうすればいいのでしょうか? お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • GOOD-Fr
  • ベストアンサー率32% (83/256)
回答No.3

理由はすでに回答があるとおりです。NULL ポインタを参照しているから。 まず最初に「までで止まってしまいます。」と書いていますが、質問するのならもう少し詳しく状況を書きましょう。最近の環境であれば NULL ポインタのアクセスを検出してエラーが出るのではないかと思います。 それから、戻り値として NULL を返してくる可能性がある関数を呼び出しているのですから、呼び出した側は戻り値が NULL であるかどうかを確認してからポインタを使わなくてはなりません。そのチェックが抜けています。 以下、本質的ではないお小言。 今回のプログラムはおそらく勉強用のサンプルなのだと思います。ですから、細かい部分にあれこれと突っ込むのは野暮だということは理解しています。が、それでも突っ込みたいところがいくつかあります。 1) stack クラスの仕様 stack クラスは push のときには char を引数として使っていますが、pop のときには char* を返しています。そして動作的には stack という名称どおり、スタック動作を行なっています。一般論としてスタックというのは、プッシュしたものがそのままポップされるものです。入るときと出るときで型が変わってしまうのでは誤解の元になりかねません。 2) pop の戻り値がポインタ 入るときと出るときで型が変わるのはいただけない、と言いましたが、それを気にしないとしても、いくつか気にするべきことがあります。ポインタを返していますから、そのポインタを使って stack クラスを呼び出した側は stack の中を直接操作できてしまいます。これでは内部構造を private にしている意味がありません。また、これはプログラマの責任ですが、このポインタを保持して「後で使おう」と思っても、スコープを抜けてしまったら stack クラスはデストラクタで破壊されます。当然、その領域をポインタで触ってはいけません。今回のプログラムでは気にしなくてよい点ですが、このふたつは頭に入れてプログラムをする必要があります。 3) クラス内での出力 「今回はサンプルで作ったから動作確認用なんです」と言うと思いますが、クラス内であれこれと出力するのはやめましょう。クラスは外部に対してインターフェースを提供するにとどめ、エラー出力や動作の確認については呼び出した側で行なうほうがいいでしょう。呼び出す側と呼び出される側の役割分担を適切に行なうのは、大きなプログラムをわかりやすく書くための基本中の基本です。 4) コンストラクタ stack::stack(char c) このコンストラクタはなぜか char を引数にとっていて、しかも仮引数名が「c」となっています。これでは「最初にひとつ c という char を push するのかな?」と誤解されかねません。実際には、この仮引数はスタックサイズを現わしていて、しかも size という int に代入されています。名前もよくないですし、わざわざ char を引数として int にキャストさせるのは推奨できません。 5) 変数 tos と stck について stack クラス内に tos と stck という二つの変数がありますが、この変数はひとつにまとめられます。同じ意味の変数がふたつあれば、そのふたつの変数の両方のつじつまを合わせる手間がかかるうえに、片方の変数だけを更新してしまうなどバグが入り込む可能性が増えます。不必要な変数は減らす努力をしましょう。 6) malloc と free ダメとまではいいませんが、C++ でわざわざ malloc と free を使う理由はありません。new と delete を使いましょう。malloc 後にエラーチェックをしているのは感心ですし、確保したメモリを忘れずに free しているのもいいと思います。が、チェックしてそのまま exit してしまうのは、クラスとしては中途半端です。もちろん今回が「サンプル」であるのは理解していますので、わざわざ突っ込むのも野暮だとは思いますが、実用的なプログラムではこのへんをどう作りこむかが大切です。 7) STL について 今回はサンプルプログラムだと思うので、意味がない話ですが C++ では STL が用意されているのが普通です。プログラムでよく使われる構造については STL に用意されていますし、速度的にも有利です。また、これが大きなポイントですが、「自分でプログラムしないのだから、バグが入らない」のも重要です。余力があれば STL も勉強しましょう。 こんなところかな。 ああ、そうだ。「後はコピーコンストラクタ、代入演算子もお忘れなく」というのも大切ですね。

20081217
質問者

お礼

実はこのソースは入門書のサンプルを使って、自分なりに変更したものなんです。これからは自分の使用しているコンパイラと何処まで勉強したのかを書いておくようにします。 >「今回はサンプルで作ったから動作確認用なんです」と言うと思いますが いや、沢山おしえてくれることはうれしいです。 いろいろありがとうございました。

その他の回答 (4)

  • S117
  • ベストアンサー率40% (18/45)
回答No.5

まじめにstackのクラスを考えるなら、空でないか判定するメンバ関数を足しましょう。 bool stack::isEmpty() そして、popも戻り値の型を変更します。 char stack::pop() 使用する側ではisEmptyで先に空でないことを判定してからpopします。 さて、不正にpopが呼び出された場合の挙動ですが、素直に作るなら例外を投げるべきです。例外を使用することで、popの戻り値が必ずスタックからポップされた値になるため、うっかり不正な値を使用する危険がなくなります。またエラーの内容もより具体的で的確になります。 不正な呼び出しに対しては不正な値を返すのではなく、例外を返すのが(特別に事情がなければ)もっとも良い選択となるでしょう。

20081217
質問者

お礼

ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.4

o=s1.pop(); cout<<"s1をポップする"<<*o<<"\n"; ↓ o=s1.pop(); if (o!=0) { cout<<"s1をポップする"<<*o<<"\n"; } o=s2.pop(); cout<<"s2をポップする"<<*o<<"\n"; ↓ o=s2.pop(); if (o!=0) { cout<<"s2をポップする"<<*o<<"\n"; } スタックが空でpop()が0を返して来たら、*oを参照してはいけない。 あと、他の回答にも書かれている通り「pop()がchar *を返すのは良くない」と思います。 これは「スタックが空の時、エラー値としてNULLを返し、そうじゃなければ成功したとしてポインタを返す」と言う、苦肉の策で「ポインタを返す」としているのでしょうね。 ですが、ここは「pop()はintを返す」とかにして「エラーの場合はpush出来ない値をintで返し、成功した場合はpushした値(文字)をintで返す」とした方が良いです。 例えば「成功の場合は-128~-1、0、1~127を返し、失敗の場合は256を返す」とか。 これなら「256をpushしても0がpopされ、成功した場合には絶対に256が返って来ない」ですから、成功とエラーが区別できます。

20081217
質問者

お礼

ありがとうございました。

回答No.2

 こんにちは。  原因はNULLポインタの中を見てしまっているからです。  void stack::push(char ch) でchar型を一つずつスタックしているのですから、  char* stack::pop() でchar*を返す事自体が似合わないのでは?    こうした方が良さそうです。 char stack::pop(){ //省略 //省略 stck--; tos--; return *stck; }  後はコピーコンストラクタ、代入演算子もお忘れなく。

20081217
質問者

お礼

それでも返せるんですか、思いつきませんでした。 ありがとうございます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

0の代わりに空文字列("")でも返してやればいいのでは? まぁ本当はいきなりcoutに投げるんではなく変数に受け取って中身チェックをすべきだろうと思いますが。

20081217
質問者

お礼

ありがとうございました。

関連するQ&A

  • 自分が思った通りにコンパイルできません

    #include<iostream> using namespace std; #define SIZE 10 class stack{ char stck[SIZE]; int tos; char who; public: stack(char c); void push(char ch); char pop(); }; stack::stack(char c){ tos=0; who=c; cout<<"生成スタック"<<who<<"\n"; } void stack::push(char ch){ if(tos==SIZE){ cout<<"スタック"<<who<<"は一杯です\n"; return; } stck[tos]=ch; tos++; } char stack::pop(){ if(tos==0){ cout<<"スタック"<<who<<"は空です\n"; return 0; } tos--; return stck[tos]; } int main(){ stack s1('A'),s2('B'); int i; s1.push('a'); s2.push('x'); s1.push('b'); s2.push('y'); s1.push('c'); s2.push('z'); for(i=0;i<5;i++)cout<<"s1をポップする"<<s1.pop()<<"\n"; for(i=0;i<5;i++)cout<<"s2をポップする"<<s2.pop()<<"\n"; return 0; } をコンパイルすると 生成スタックA 生成スタックB s1をポップするc s1をポップするb s1をポップするa スタックAは空です s1をポップする スタックAは空です s1をポップする s2をポップするz s2をポップするy s2をポップするx スタックBは空です s2をポップする スタックBは空です s2をポップする となったのですが、自分は 生成スタックA 生成スタックB s1をポップするc s1をポップするb s1をポップするa s1をポップする スタックAは空です s1をポップする スタックAは空です s2をポップするz s2をポップするy s2をポップするx s2をポップする スタックBは空です s2をポップする スタックBは空です になると思いました。何故こうなるのでしょうか?お願いします

  • 独習C++

    お世話になります。 環境はWindowsXP+BorlandC++コンパイラです。 独習C++で勉強しているのですが、練習問題1.5.1で、次のようなプログラムを作成しました。 ※インデントのため全角スペースを使用しています。 #include <iostream> using namespace std; #define SIZE 10 class stack{  char stck[SIZE];  int tos; public:  void init();  void push(char ch);  char pop(); }; void stack::init() {  tos = 0; } void stack::push(char ch) {  if(tos == SIZE)  {   cout << "スタックは一杯です。";   return;  }  stck[tos] == ch;  tos++; } char stack::pop() {  if(tos==0)  {   cout << "スタックは空です";   return 0;  }  tos--;  return stck[tos]; } int main(void) {  stack s1;  int i;  s1.init();  s1.push('a');  s1.push('b');  s1.push('c');  for(i=0; i<3; i++)  {   cout << "s1をポップする:" << s1.pop() << "\n";  }  return 0; } 期待する動作は s1をポップする:c s2をポップする:b s3をポップする:a なんですが、コンソールでは、 s1をポップする:A s2をポップする:ェ s3をポップする:h と表示されます。 テキストを写しただけなのでコード上は問題ないように見えるのですが、どこがおかしいのでしょうか? 原因と対策をご教示ください。 宜しくお願い致します。

  • c言語 スタックの標準入力の課題です

    c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }

  • スタックのプログラムを作成しているのですが、うまく出来ません。

    プログラムの内容を簡単に言うと、配列s[100]と変数topを用いて、ファイルdata.datからgetc()を用いて文字を1文字ずつ読み込み、スタック(s[100])にpush-downするプログラムです。 細かく言うと、作成したプログラムによりファイルからキー(文字)を読み込みスタックにpush-downし、スタックの内容を表示した後に、キーボードからキー(文字)を1文字ずつ入力して、スタックを操作する。 ・スタック操作の仕様はキーボードからキー(文字)を1文字ずつ入力する際に、0を入力した場合、プログラム終了。1を入力した場合、1文字pop-upした後、pop-upした文字とスタックの内容を表示。その他の文字を入力した場合、その文字をpush-downした後、スタックの内容を表示。(スタックの内容の表示はprint_stack_mtrx(s,top)を使用する。) ・push-downとpop-upはそれぞれ1つの関数で定義する。 といった感じのプログラムを作成しているのですが、関数push,popの部分をどう書いたら良いのか良く分かりません。一応自分で書いてみたのですが、うまくいきませんでした。どなたか教えていただけないでしょうか? *ファイルdata.datからはリダイレクションを用いて読み込む。 <作成途中のソースプログラム> #include<stdio.h> #include<stdlib.h> #define MAX 100 char s[MAX]; int top; void init_stack(){ ______top = 0; _______return; } void print_stack_mtrx(char* s, int top){ __int i; ____if(top == 0){ ______printf("Stack is empty.\n"); ____} ____else{ ______printf("--- Contents of Stack ---\n"); ______for(i = 0; i < top; i++){ ________if(!i){ __________printf("%2c < -- Top (%2d)\n", s[top - i - 1], top); ________} ________else{ __________printf("%2c \n", s[top - i - 1]); ________} ______} ______printf("-------------------------\n"); ____} } char push(char* s, int top, char j){ ___s[top]=j; ___top++; } char pop(char* s, int top){ _char c; ___c = s[top]; ___top--; ___return c; } int main(void) { _int c; _char j; _char i; init_stack(); _______while(((c=getc(stdin))!=EOF) && top<MAX){ _______/* ファイルdata.dat からgetc()を用いて1文字ずつ読み込みスタックsに格納.ただしスタックの出入り口を示す top の値も監視すること*/ _________s[top] = c; _________top++; _______} _______print_stack_mtrx( s, top );/* スタック(配列)の内容を表示する関数*/ _______while(1){ _________scanf("%c\n", &j); _________if(j=='0'){ ___________break; _________} _________else if(j=='1'){ ___/* 1文字pop-upした後, pop-upした文字とスタックの内容を表示 */ ___________i = pop(s, top); ___________printf("pop-upした文字: %c\n", i); ___________print_stack_mtrx( s, top ); _________} _________else{ ___/* その他の文字を入力した場合, その文字をpush-downした後,スタックの内容を表示 */ ___________push(s, top, j); ___________print_stack_mtrx( s, top ); _________} _______} _______return 0; }

  • スタックのデータ構造を作りたい

    C言語でスタックと、スタックにデータを入れるプッシュ、取り出すポップを作りたいと思っており そこで以下のようなものを作ってみました。 ********************************************** #include<stdio.h> typedef struct{ int a[100]; int head=0; }Stack; void push(Stack stc,int x){ stc.a[head]=x; stc.head++; } int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } int main void{ int j; Stack s; push(s,5); push(s,90); j=pop(s); printf("%d",j); j=pop(s); printf("%d",j); return 0; } ****************************** コンパイルするとエラーが出まくりです。 何をどう直せばよいのか、どこが変なのかご教授いただきたいです。 よろしくお願いいたします。

  • スタックについて

    スタックを実現するプログラムを作っているのですが、実行するとセグメテーション違反が表示されます。でもどこが間違っているのかわかりません!どうしたらいいのでしょう? #include<stdio.h> #include<stdlib.h> struct stack{ int max; int used; int *array; }; struct stack * stack_create(int n) { struct stack *s; int i; s->array=(int *)malloc(sizeof(int)*n); s->used=0; s->max=n; return 0; } void stack_free(struct stack *s) { free(s); } int stack_push(struct stack *s,int datum) { if(s->used>=s->max){ return 0; } s->array[s->used]=datum; s->used++; return 1; } int stack_pop(struct stack *s,int *datump) { if(s->used<=0){ return 0; } *datump=s->array[s->used-1]; s->used--; return 1; } int stack_is_empty(const struct stack *s) { return s->used==0; } int main() { struct stack s; int i,p; int n; scanf("%d",&n); stack_create(n); for(i=0;i<=5;i++){ stack_push(&s,i); printf("push%2d\n",i); } for(i=1;i<=3;i++){ stack_pop(&s,&p); printf("pop%2d\n",p); } }

  • C言語で変更していただきたい所があるのですが・・・

    下のソースを加減乗除だけでなく、余りを求める演算(%)やべき乗演算(^)も使えるようにしたいのですがうまくいきません。 どなたか変更例をお見せできますでしょうか? #include <stdio.h> #include <stdlib.h> #define STACK_MAX 10 /* 配列によるスタック構造 */ double stack[STACK_MAX]; /* スタック頂上の位置(最下部からのオフセット)*/ int stack_top = 0; /* スタックへのpush */ void stack_push(double val) { if(stack_top == STACK_MAX) { /* スタックが満杯になっている */ printf("エラー:スタックが満杯です(Stack overflow)\n"); exit(EXIT_FAILURE); } else { /* 渡された値をスタックに積む */ stack[stack_top] = val; stack_top++; } } /* スタックからpop */ double stack_pop(void) { if(stack_top == 0) { /* スタックには何もない */ printf("エラー:スタックが空なのにpopが呼ばれました" "(Stack underflow)\n"); exit(EXIT_FAILURE); return 0; } else { /* いちばん上の値を返す */ stack_top--; return stack[stack_top]; } } int main(void) { char buffer[256]; double cal1, cal2; int i; do { printf("現在のスタック(%d個):", stack_top); for(i = 0; i < stack_top; i++) { printf("%0.3f ", stack[i]); } printf("\n>"); fgets(buffer, 255, stdin); switch(buffer[0]) { case '+': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 + cal1); break; case '-': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 - cal1); break; case '*': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 * cal1); break; case '/': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 / cal1); break; case '=': /* =の場合はこのすぐあとでwhile文からも抜ける */ break; default: /* 入力された値は数字のはずなので,スタックに積む */ stack_push(atoi(buffer)); break; } } while(buffer[0] != '='); printf("計算結果は%f です。\n",stack_pop()); if(stack_top != 0) { printf("エラー:スタックにまだ数が残っています\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }

  • コンパイルはできるのですが

    C++入門者です。C言語の範疇です。 コンパイルはできるのですが、実行すると ”問題が発生したため、*****.exe を終了します。 ご不便をおかけして申し訳ありません。” というウィンドウがででしまします。 どこで誤っているのかわからなくて困っています。 どなたかご教授願えないでしょうか。 どうかよろしくお願いいたします。 -----プログラム内容です。----- #include<iostream> using namespace std; int main() { char *s1 ,*s2; cin >> s1; for (int i=0;i <= strlen(s1)-1;i++) { *(s2+i) = *(s1 + strlen(s1) - 1 - i); } *(s2+strlen(s1)) = '\0'; cout << s1 << '\n'; cout << *(s2) << '\n'; return 0; } --------------------------------------

  • 文が指定されていませんエラーについて

    public class Stack2 { private static int[] stack = new int[50]; private static int ip = -1; //スタックポインター, -1ならデーターなし public static int push ( int inData ) { // データー格納 if (ip == (stack.length - 1)) { System.out.println(\"スタックがいっぱいです\"); } else { stack[++ip] = inData; } } public static int pop ( ) { // データー取り出し if ( ip < 0 ) { System.out.println (\"スタックにデーターがありません\"); return -2147483648; } else { return stack[ip]; } } } 「Stack2.java:10:return 文が指定されていません」コンバイルエラーになります。 どのようにデバックすれば良いのか教えてください。

  • プログラムについて

    今スタっクのファイルから読み込んだ文字列をスタっクへプっシュしたりポっプしたりする過程がわかるプログラムを作ってます 。 作りかけのプログラムですがどこをどうすればいいか教えてください!! 一応コンパイルできます。 使ってない関数があるかもしれません。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックのサイズ */ int ptr; /* スタックポインタ */ char *stk; /* スタック(の先頭要素へのポインタ) */ } Stack; /*--- スタックの初期化 ---*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の確保に失敗 */ return (-1); } s->max = max; return (0); } /*--- スタックの後始末 ---*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*--- スタックにデータをプッシュ ---*/ int StackPush(Stack *s, int x, int i,char *a[]) { if (s->ptr >= s->max) return (-1); if(x>=i) { puts("プッシュできる文字データはありません。"); return (-1); } strcpy(&s->stk[s->ptr++],&(*a)[x]); x++; return x; } /*--- スタックからデータをポップ ---*/ int StackPop(Stack *s, int x,char *a[]) { if (s->ptr <= 0) /* スタックは空 */ return (-1); strcpy(&s->stk[--s->ptr],&(*a)[x]); return (0); } /*--- スタックからデータをピーク ---*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*--- スタックの大きさ ---*/ int StackSize(const Stack *s) { return (s->max); } /*--- スタックに積まれているデータ数 ---*/ int StackNo(const Stack *s) { return (s->ptr); } /*--- スタックは空か ---*/ int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } /*--- スタックは満杯か ---*/ int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } /*--- スタックを空にする ---*/ void StackClear(Stack *s) { s->ptr = 0; } int main(void) { int i=0,j,ret,x=0; char *a[NUMBER]; char buffer[20]; FILE *fpin; Stack s; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } strcpy(&a[i][0],&buffer[0]); /*ret=sscanf(&buffer[0],"%s",&a[i][0]); //データ文字列を3分割 if(ret!=1) //1に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; }*/ i++; } for(j=0; j<i; j++) printf("%s\n",&(*a)[j]); if (StackAlloc(&s, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m; printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: printf("データ:"); puts("こんちくしょ~"); if(StackPush(&s, x,i,&(*a)) == -1) puts("スタックへのプッシュに失敗しました。"); break; case 2: if(StackPop(&s, x,&(*a)) == -1) puts("ポップできません。"); else printf("ポップしたデータは%sです。\n", &s.stk[s.ptr]); break; } } StackFree(&s); END: fclose(fpin); return (0); }

専門家に質問してみよう