前提・実現したいこと
スタック型計算機を作成しています。キーボードとファイルの両方からデータ入力をしたいのですが、ファイルからのデータ入力がうまくいきません。
ファイル:data.txtには 9 1 - 3 * 7 - と書いてあります。
もっともファイルからのデータの入力についてもいまいちです...
発生している問題・エラーメッセージ
五行目で定義したスタックサイズを七行目で定義したスタックのポインタが上回り、stack overflowになります。
該当のソースコード
C
1 2#include <stdio.h> 3#include <stdlib.h> 4#include <ctype.h> 5 6typedef long ELEMENT; 7 8#define STACK_SIZE 100 9 10ELEMENT stack[STACK_SIZE]; 11int n; 12 13/*push関数**/ 14void push(ELEMENT x) 15{ 16 if (n>=STACK_SIZE){ 17 printf("stack overflow"); /*ファイルからの入力を試みた際に、このエラーメッセージが表示されます。*/ 18 exit(1); 19 } 20 stack[n++]=x; 21} 22 23/*pop関数*/ 24ELEMENT pop() 25{ 26 if (n<=0){ 27 printf("stack underflow"); 28 exit(1); 29 } 30 return stack[--n]; 31} 32 33int main(void) 34{ 35 n=0; /*スタックの初期化*/ 36 37 int s; 38 printf("数字データの時はスタックに積み、ピリオドの時はスタックから降ろします。(EOFで終了)\n"); 39 printf("データ入力の方法を選んでください。\n0..キーボード/1..ファイル:"); 40 scanf("%d",&s); 41 int c ; 42 long x,a,b; 43 FILE *fp; 44 45 if (s==0){ 46 while((c=getchar())!=EOF){ 47 48 if (isdigit(c)){ 49 ungetc(c,stdin); 50 scanf("%ld",&x); 51 push(x); 52 }else{ 53 switch (c){ 54 case '.': 55 pop(); 56 break; 57 case '+': 58 b=pop();a=pop(); 59 push(a+b); 60 break; 61 case '-': 62 b=pop();a=pop(); 63 push(a-b); 64 break; 65 case '*': 66 b=pop();a=pop(); 67 push(a*b); 68 break; 69 case '/': 70 b=pop();a=pop(); 71 push(a/b); 72 break; 73 case ' ': 74 break; 75 case '\n': 76 if(n!=0) 77 printf("答えは%ldです。",pop()); 78 n=0; 79 break; 80 81 default: 82 printf("不正な入力です。\n"); 83 while ((c=getchar())!=EOF && c!='a') 84 ; 85 break; 86 } 87 } 88 } 89 90 91 }else if (s==1){ /*ファイルからの入力*/ 92 char data[100]={0}; /*訂正箇所:0クリア*/ 93 int ch; 94 int q=1; 95 96 fp=fopen("data.txt","r"); 97 if (fp==NULL){ 98 printf("ファイルオープン失敗\n"); 99 return 1; 100 } 101 102 for (int i=0;i<100;i++){ 103 data[i]=fgetc(fp); 104 if (data[i]==EOF) break; 105 } 106 107 for (int i=0;data[i]!='\0';i++){ 108 if (isdigit(data[i])){ 109 push(data[i]); 110 }else{ 111 switch (data[i]){ 112 case '.': 113 pop(); 114 break; 115 case '+': 116 b=pop();a=pop(); 117 push(a+b); 118 break; 119 case '-': 120 b=pop();a=pop(); 121 push(a-b); 122 break; 123 case '*': 124 b=pop();a=pop(); 125 push(a*b); 126 break; 127 case '/': 128 b=pop();a=pop(); 129 push(a/b); 130 break; 131 case ' ': 132 break; 133 case '\n': 134 if(n!=0) 135 printf("答えは%ldです。",pop()); 136 n=0; 137 break; 138 139 default: 140 push(data[i]); 141 break; 142 } 143 } 144 145 146 } 147 fclose(fp); 148 } 149 return 0; 150} 151
試したこと
5、7行目のサイズを変えてみましたがダメでした
補足情報(FW/ツールのバージョンなど)
Xcode Version 11.2 (11B52)
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/06 07:54
2020/06/06 08:11
2020/06/06 09:41
2020/06/06 13:38