在我的修复后计算器上出现分段错误

时间:2014-05-17 20:59:03

标签: c++ calculator

我正在尝试编写一个后修复/反向抛光计算器,只有在每个数字之前,每个操作符之前会有一个'#','!'和'''。表示结束表达。每个数字/字符/等之间有一个空格。我不关心错误检查。

我知道你可以在这里使用stringstream,但我仍然认为没有它就可以工作。

输入控制台的输入看起来像是

# 33 # 3 ! / # 2 ! *.

然后输出22.我目前正在使用以下代码获得分段错误。

感谢您的光临。

#include <iostream>
#include <cstdlib>
#include <math.h>

using namespace std;

class Stack{   
    public:
    Stack(){
        this->size = 0;
    }

    Stack & push(double c){
        if (size == MAX_SIZE) die("Push Overflow");
        data[size] = c;
        size++;
        return *this;
    }

    double pop(){
        return data[--size];    
    }

    double top() const{
        return data[size-1];
    }

    unsigned getSize() const{return size;}

    bool die(const string & msg){   
        cerr << "Fatal Error: " << msg << endl;
        exit(EXIT_FAILURE);   
    }

    void show(){   
        for (int i = 0; i < size; i++){
            cout << data[i] << endl;
    }}

    private:

    static const unsigned MAX_SIZE = 50;
    double data[MAX_SIZE];
    unsigned size;
};


int main(){
    Stack s1;
    bool inputComplete = false;
    double num1 =0;
    double num2 = 0;
    double answer = 0;
    char c, ch;

    while(!inputComplete){       
        cin >> ch;   
        if (ch == '!'){
            cin >> c;

            num1 = s1.pop();
            num2 = s1.pop();

            switch(c){    

                case '+':
                answer = num2 + num1;
                break;    

                case '-':
                answer = num2 - num1;
                break;    

                case '/':
                answer = num2/num1;
                break;    

                case '^':
                answer = pow(num2, num1);
                break;    

                case '*':
                answer = num2 * num1;
                break;   
            }
            s1.push(answer);
        }    
        else if (c == '#'){  
            double number;
            cin >> number;
            s1.push(number);   
        }
        else if (c == '.'){
            inputComplete == true;
        }
    }

    s1.show();    
    return 0;
}

2 个答案:

答案 0 :(得分:2)

我发现的问题:

该行

    else if (c == '#'){  

应该是

    else if (ch == '#'){  

该行

    else if (c == '.'){  

应该是

    else if (ch == '.'){  

该行

        inputComplete == true;

应该是

        inputComplete = true;

<强>更新

我意识到您不需要任何错误检查代码。但是最少量的错误检查很有用。为此,我认为你应该检查何时达到EOF。

    ch = cin.get();
    if ( ch == EOF )
    {
       inputComplete = true;
    }
    else if (ch == '!'){

而不是

    cin >> ch;
    if (ch == '!'){

对我有意义。

答案 1 :(得分:1)

最后有

else if (c == '.'){
    inputComplete == true;
}

但它应该是

else if (c == '.'){
    inputComplete = true;
}