質問するログイン新規登録

回答編集履歴

4

追記

2020/06/10 05:07

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -26,4 +26,137 @@
26
26
  更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れを起こしてます。
27
27
 
28
28
  あ...main() で scanf("%s", formula); やってるのもトラブルの原因。
29
- これだと空白が読みこまれず、"12 34 +" の入力に対し formulaは"12"となります。
29
+ これだと空白が読みこまれず、"12 34 +" の入力に対し formulaは"12"となります。
30
+
31
+ [追記]
32
+ ```C
33
+ #define _CRT_SECURE_NO_WARNINGS
34
+ #include <stdio.h>
35
+ #include <stdlib.h>
36
+ #include <ctype.h>
37
+ #include <string.h>
38
+ #include <stdbool.h>
39
+ #include <assert.h>
40
+
41
+ typedef long ELEMENT;
42
+ const char* ELEMENT_FORMAT = "%ld";
43
+
44
+ #define STACK_SIZE 100
45
+
46
+ typedef struct {
47
+ ELEMENT body[STACK_SIZE];
48
+ int size;
49
+ } Stack;
50
+
51
+ void initialize(Stack* stack) {
52
+ assert( stack );
53
+ stack->size = 0;
54
+ }
55
+
56
+ /*push関数**/
57
+ bool push(Stack* stack, ELEMENT x) {
58
+ assert( stack );
59
+ if ( stack->size >= STACK_SIZE) {
60
+ fputs("stack overflow!", stderr);
61
+ return false;
62
+ }
63
+ stack->body[stack->size++] = x;
64
+ return true;
65
+ }
66
+
67
+ /*pop関数*/
68
+ bool pop(Stack* stack, ELEMENT* px) {
69
+ assert( stack );
70
+ assert( px );
71
+ if ( stack->size <= 0) {
72
+ fputs("stack underflow!", stderr);
73
+ return false;
74
+ }
75
+ *px = stack->body[--stack->size];
76
+ return true;
77
+ }
78
+
79
+
80
+ bool getnumber(const char* formula, ELEMENT* px) {
81
+ assert( formula );
82
+ assert( px );
83
+ return sscanf(formula, ELEMENT_FORMAT, px) == 1;
84
+ }
85
+
86
+ void calculate(Stack* stack, char* formula) {
87
+ assert( stack );
88
+ assert( formula );
89
+ char* token;
90
+ for ( token = strtok(formula, " \t\n"); token; token = strtok(NULL, " \t\n") ) {
91
+ ELEMENT x;
92
+ ELEMENT a, b;
93
+ if ( getnumber(token, &x) ) {
94
+ push(stack, x);
95
+ } else {
96
+ if ( false ) ; /* do nothing */
97
+ else if ( strcmp(token, ".") == 0 ) {
98
+ pop(stack, &x);
99
+ }
100
+ else if ( strcmp(token, "+") == 0 ) {
101
+ pop(stack, &b);
102
+ pop(stack, &a);
103
+ push(stack, a + b);
104
+ }
105
+ else if (strcmp(token, "-") == 0) {
106
+ pop(stack, &b);
107
+ pop(stack, &a);
108
+ push(stack, a - b);
109
+ }
110
+ else if (strcmp(token, "*") == 0) {
111
+ pop(stack, &b);
112
+ pop(stack, &a);
113
+ push(stack, a * b);
114
+ }
115
+ else if (strcmp(token, "/") == 0) {
116
+ pop(stack, &b);
117
+ pop(stack, &a);
118
+ push(stack, a / b);
119
+ } else {
120
+ fprintf(stderr, "[%s] unknown\n", token);
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ int main(void) {
127
+ Stack stack;
128
+ initialize(&stack);
129
+
130
+ int s;
131
+ char formula[256] = { 0 };
132
+ printf("数字データの時はスタックに積み、ピリオドの時はスタックから降ろします。(EOFで終了)\n");
133
+ printf("データ入力の方法を選んでください。\n0..キーボード/1..ファイル:");
134
+ scanf("%d", &s);
135
+ FILE* fp = stdin;
136
+
137
+ if (s == 1) {
138
+ fp = fopen("data.txt", "r");
139
+ if (fp == NULL) {
140
+ printf("ファイルオープン失敗\n");
141
+ return 1;
142
+ }
143
+ fgets(formula, sizeof(formula), fp);
144
+ fclose(fp);
145
+ calculate(&stack, formula);
146
+ }
147
+ else if (s == 0) {
148
+ printf("Input:");
149
+ gets_s(formula, 32); // 一度空読み
150
+ fgets(formula, 32, stdin);
151
+ calculate(&stack, formula);
152
+ }
153
+
154
+ ELEMENT x;
155
+ pop(&stack, &x);
156
+ printf("result = ");
157
+ printf(ELEMENT_FORMAT, x);
158
+ puts("");
159
+
160
+ return 0;
161
+ }
162
+ ```

3

追記

2020/06/10 05:07

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -23,4 +23,7 @@
23
23
  ```
24
24
 
25
25
  あと(こっちの方が重要なんだが)getnumber()から戻ってきたときに formula が
26
- 更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れを起こしてます。
26
+ 更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れを起こしてます。
27
+
28
+ あ...main() で scanf("%s", formula); やってるのもトラブルの原因。
29
+ これだと空白が読みこまれず、"12 34 +" の入力に対し formulaは"12"となります。

2

微修正

2020/06/09 00:00

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -23,4 +23,4 @@
23
23
  ```
24
24
 
25
25
  あと(こっちの方が重要なんだが)getnumber()から戻ってきたときに formula が
26
- 更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れを起こしてます。
26
+ 更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れを起こしてます。

1

追記

2020/06/08 23:57

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -20,4 +20,7 @@
20
20
  if (sign) return -n;
21
21
  return n;
22
22
  }
23
- ```
23
+ ```
24
+
25
+ あと(こっちの方が重要なんだが)getnumber()から戻ってきたときに formula が
26
+ 更新されないために、最初に現れた数値を延々とpush()し続けてスタック溢れてを起こしてます。