こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

以下のソースコードについて

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int top, S[1000];

void push(int x) {
S[++top] = x;
}

int pop() {
top--;

return S[top + 1];
}

int main() {
int a, b;
top = 0;
char s[100];

while (scanf_s("%s", s) != EOF) {
if (s[0] == '+') {
a = pop();
b = pop();
push(a + b);
}
else if (s[0] == '-') {
b = pop();
a = pop();
push(a - b);
}
else if (s[0] == '*') {
a = pop();
b = pop();
push(a*b);
}
else {
push(atoi(s));
}
}

printf("%d\n", pop());

return 0;
}
このコードはプログラミングコンテストのためのアルゴリズムとデータ構造という本に
書かれていたコードで、項目はスタック構造に当たるものです。このコードを写してVIsual C++
に通したところ(バージョンは2015)エラーが発生しました。
どうしたらよいでしょうか
問題のURLはhttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A
です。言語はCです。

投稿日時 - 2015-09-01 14:34:03

QNo.9040227

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

出力されるにはwhile文から抜ける必要があり、その条件はscanf_sがEOFを返すことです。
そのためには、Ctrl+Zを入力する必要があります。
topはスタックの位置を記憶しているので、入力されたsの位置とは関係がありません。

投稿日時 - 2015-09-02 00:38:52

ANo.2

どんなエラーが出ますか?
Visual Studio 2013で試したところ、コンパイルは通りました。
ただ、scanf_sはバッファサイズを指定しないといけないので、

while(scanf_s("%s",s,99)!=EOF) {

でないと実行時に問題が発生します。

回答1の件は、Visual Studio 2013以降ではC99の大半をサポートしているので、問題にならないはずです。

投稿日時 - 2015-09-01 16:34:52

補足

エラーについて書き忘れていました・・・
コンパイラは通るのですが、入力をするとエラーが発生していました。
なおしたところ入力はできるのですが、出力が出てきません
あと関係ない質問ですがs[0]=='+'
の演算子の判定部分のところはなぜ添え字が0なのでしょう?
自分はtopだと思ったのですが・・・

投稿日時 - 2015-09-01 21:36:12

ANo.1

> top = 0;
> char s[100];

C言語では「変数宣言は、ブロックの先頭のみで可能」です。

上記では、実効コード(実行を行なうコード)である「top = 0;」と言う代入文の次に「char s[100];」という変数宣言が書いてあり、実効コードを書いた後で、変数を宣言しようとしています。

この2行を入れ替えましょう。

蛇足ですが

>int pop() {
> top--;
> return S[top + 1];
>}



int pop() {
return S[top--];
}

で良いと思われます。

投稿日時 - 2015-09-01 15:14:19

あなたにオススメの質問