c++ - 将字符串分配给 stack.top() 时出现段错误

标签 c++ segmentation-fault postfix-notation infix-notation shunting-yard

我一直在研究一个基本的计算器,它可以接受复杂的数学表达式,例如:(2-4)*7/(3/4) 等等

我正在使用调车场算法的实现...

我在 linux 操作系统上。使用 gdb 调试器,我已将段错误隔离到一个函数。 使用 cout 语句我将它进一步隔离到一行..但是我不明白为什么这条线给我一个段错误..我将在短时间内提供更多关于确切位置的信息,首先是一些代码..

bool infixToPostfix(const std::vector<std::string>& inputTokens, const int& size, std::vector<std::string>& strArray){
     std::cout << "1" << std::endl; 
     bool success = true;
     std::list<std::string> out;
     std::stack<std::string> st;

for(int i = 0; i < size; i++){
    std::cout << "2\n";
    const std::string token = inputTokens[i];

    if(isOperator(token)){
        std::cout << "3\n"; 
        const std::string o1 = token;

        if(!st.empty()){
            std::cout << "4\n";
            std::string o2 = st.top();

            while(isOperator(o2) && ((isAssociative(o1, LEFT_ASSOC) && cmpPrecedence(o1, o2) == 0) || (cmpPrecedence(o1, o2) < 0))){
                std::cout << "5\n";
                st.pop();
                out.push_back(o2);

                if(!st.empty()){
                    std::cout << " 6\n";    
                    o2 = st.top();
                }
                else{
                    std::cout << "7\n";
                    break;
                }
            }    
        }
        std::cout << "8\n";
        st.push(o1);
    }
    else if(token == "("){
        std::cout << "9\n";
        st.push(token);
    }
    else if(token == ")"){
        std::cout << "10\n";
        std::string topToken = st.top();

        while(topToken != "("){
            std::cout << "11\n"; 
            out.push_back(topToken);
            st.pop();

            if(st.empty() ){
                std::cout<< "12\n";
                break;
            }
            std::cout << "13\n";
            topToken = st.top();
        }
        if(!st.empty()){
            std::cout << "14\n";
            st.pop();
        }
        if(topToken != "("){
            std::cout << "15\n";
            return false;   
        }
    }
    else{
        std:: cout << "16\n";
        out.push_back(token);
    }
}
while(!st.empty()){
    std:: cout << "17\n";
    const std::string stackToken = st.top();

    if(isParentheses(stackToken)){
        std::cout << "18\n";
        return false;
    }
    std::cout << "19\n";
    out.push_back(stackToken);
    st.pop();
}
std::cout << "20\n";
strArray.assign(out.begin(), out.end());
return success; 
}

段错误发生在 std::cout << "10\n";打电话时 std::string topToken = st.top();

我会给出一些输入/输出

输入:(8*2) 输出:1 2 9 2 3 4 8 2 3 4 5 6 8 2 10 11 13 14 2 10 segfault (core dumped)

输入:(4/4) 输出:1 2 9 2 3 4 8 2 3 4 5 6 8 2 10 11 13 14 2 10 segfault (core dump)

还有一些我运行的测试可以很容易地张贴在这里,但老实说,它们变得非常多余。如果你们想看更多,只需要问我,我很乐意提供更多。但是我觉得这两个应该提供足够的信息......

我知道段错误发生在何处,并且我有预感为什么会发生......因此,如果有人能向我确认错误发生的确切原因,那就太好了,我们将不胜感激任何解决该问题的方法。

P.S:代码中的任何错别字都是错别字!我通过重新输入代码来复制代码,因为我在 linux 操作系统上编码,但我拥有一台电脑。话虽如此……代码编译没有错误,任何拼写错误的术语都是拼写错误!!

再次感谢

编辑:在给了它几天之后又回到这里,我对代码进行了更多测试。这次使用不带括号的方程式。

输入:3-9 输出:1 2<br/> 3 8 2 3 4 5 7 8 17 19 20 segfault (core dump)

输入:6/8 输出: 1 2 3 8 2 3 4 5 7 8 17 19 20

所以我在调用 strArray.assign( out.begin(), out.end() ); 时也遇到了段错误

最佳答案

const std::string token = inputTokens[i]; 行之后添加以下内容:

std::cout << "inputTokens[" << i << "]: " << token << std::endl;

我认为您会发现 inputTokens vector 存在问题,或者 size 可能不正确。

出于好奇 - 为什么将 size 作为参数传递而不是使用 inputTokens.size()

关于c++ - 将字符串分配给 stack.top() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435234/

相关文章:

c++ - 如何在 OSX lion 上使用 clang 3.2 编译 C++11?

c - 未按预期收到段错误

c - 段错误问题。尝试在 C 中实现双向链表 FIFO 队列

c - 我需要帮助在 C 中从中缀转换为后缀

c++ - 为什么不满足我的 "while"条件?

c++ - 表达式:双端队列迭代器不可取消引用

c++ - 将类内的随机数 boost 为静态成员

c++ - uint64_t 的 tr1::hash

c++ - 强制注册派生类型

c++ - QHostAddress 的段错误