【问题标题】:Getting a segmentation fault on my post-fix calculator在我的修复后计算器上出现分段错误
【发布时间】:2014-07-06 03:10:07
【问题描述】:

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

我知道你可以在这里使用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;
}

【问题讨论】:

  • 首先,我会在函数pop 中添加if (size == 0) die("Pop Underflow");
  • 只有波兰人才能编写波兰计算器的实现。
  • 真正退出循环,c变量什么时候有有效内容?确定这将有助于隔离问题。它的编写方式是,c 仅在 ch! 时才被设置。 else if 部分是否用于检查 ch 变量?

标签: c++ calculator


【解决方案1】:

最后有

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

但应该是的

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

【讨论】:

  • 感谢您的帮助,阿兰!
【解决方案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 == '!'){

对我来说很有意义。

【讨论】:

  • 谢谢!!这些更改解决了我的问题。不敢相信我错过了条件语句中的“ch”。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2011-05-09
  • 2021-08-31
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多