実現したいこと
逆ポーランド記法を用いた計算結果を求めるコードを知りたいです。
スタックやスタックに関する関数を使っており、ファイル(テキスト)を開いて中の文字列を読み取って計算します。
発生している問題・分からないこと
デバッグした際にfopenでファイルを開いても文字列を読み取れないのか、関係ない数列が表示される。
該当のソースコード
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int STACK_ITEM; #define STACK_SIZE 30 STACK_ITEM stack[STACK_SIZE]; int sp = 0;//スタックポイント //Init スタックを初期化する void Init() { sp = 0; } //IsEmpty スタックが空かどうかを調べる int Isempty(void) { if (sp == 0) { return 1; } else { return 0; } } //Push 引数の値をスタックに積み上げる void Push(STACK_ITEM data) { if (sp < STACK_SIZE) { stack[sp] = data; sp++; } } //Pop スタックの先頭から要素を取り出す STACK_ITEM Pop(void) { if (sp > 0) { sp--; return stack[sp]; } else { return 0; } } /* 入力ファイルを読み込み、計算結果を出力する 入力ファイルには1行ポーランド記述法で数式が記入されている。 空白を区切り文字とする。 入力ファイルの記入例:3 5 * 10 2 * - 上の記入例は次式 3*5-10*2 を示している */ int main(void) { STACK_ITEM a, b; Init(); char s[100]; FILE *fp; char infile[30]; printf("Input File:"); scanf("%s", infile); fp = fopen(infile, "r"); while (fscanf(fp, "%s", s) != EOF) { if (s == '+') { b = Pop(sp); a = Pop(sp); a = a + b; Push(a); printf("%d\n", a); } else if (s == '-') { b = Pop(sp); a = Pop(sp); a = a - b; Push(a); printf("%d\n", a); } else if (s == '*') { b = Pop(sp); a = Pop(sp); a = a * b; Push(a); printf("%d\n", a); } else { atoi(s); Push(s); printf("%d\n", &s); } } printf("%d\n", Pop()); fclose(fp); return 0; }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
whileの中身をprintfにしてfscanfの中身を表示させるだけのコードに変えても結果は変わらなかった。
補足
特になし
そもそもコンパイルが通りません
確かに、gccとかだとコンパイルは通りませんが、Visual Studioですよね。
1行目に、#define _CRT_SECURE_NO_WARNINGSがあるので。
warningてんこ盛りだけど、一応コンパイルは通る。
ここからなのに、退会してしまって残念ですね。
> warningてんこ盛りだけど、一応コンパイルは通る。
VCはほぼ使ったこと無いのですが、引数の個数が違ってもエラーじゃなくて警告がでるのみで、動いちゃうんですか?
VC好きとしては、VC一般的な話だと思ってほしくないけど、このソースに限っては動きます。
まさに質問者さんの言う通り、
「デバッグした際にfopenでファイルを開いても文字列を読み取れないのか、関係ない数列が表示される。」
なのです。まさか、「コンパイルが通りません」で、はね返されるとは思っていなかったことでしょう。
残念です。
情報ありがとうございます。実引数が多くても、余分なのは無視して動くと言うことですか。足りない場合はさすがにエラーですよね?
Cの規格的には、個数が異なれば未定義なので動いてもよいということか。
未定義動作で動いているプログラムのデバッグはちょっと意欲がそがれます。
良くも悪くも流石 MS 製という感じ。
