前缀表示法c ++,分段错误(堆栈和队列)

时间:2017-07-27 12:08:02

标签: c++ stack queue postfix-notation

我试图弄清楚为什么我会出现分段错误,我的猜测是它在我的recusive函数中,它模拟了前缀表示法操作。

例如

“m + 4 4”返回:“+ m 8”

在测试期间,我得到一个分段错误信号:

  

退出信号11(SIGSEGV)

我相信问题在于我的重复功能“操作”

string Operate(stack<string> &S, queue<string> &Q)
{
    S.push(Q.front());
    Q.pop();

    std::string::size_type sz;
    string result = "";
    if (IsOperator(S.top()) == true)
    {
        S.push(Operate(S, Q));
    }

    if (Q.empty() == false)
    {
        S.push(Q.front());
        Q.pop();
        if (IsOperator(S.top()) == true)
        {
            S.push(Operate(S, Q));
        }

        if (S.size() < 3)
            return "wrong input";

        string arg1 = S.top();
        S.pop();

        string arg2 = S.top();
        S.pop();

        string oper = S.top();
        S.pop();

        if (StringIsDigit(arg1) && StringIsDigit(arg2))
        {
            int a = stoi(arg1, &sz);
            int b = stoi(arg2, &sz);
            char o = oper.at(0);

            int c = 0;

            if (o == '+')
                c = b + a;
            else if (o == '-')
                c = b - a;
            else if (o == '*')
                c = b * a;
            else
                return "e";

            result = to_string(c);
        }
        else
            result = oper + " " + arg2 + " " + arg1;
    }
    else
    {
        result = S.top();
        S.pop();
    }

    return result;
}

或在函数StringIsDigit中:

bool StringIsDigit(string arg)
{
    bool result = true;
    for (int i = 0; i < arg.size() && result == true; i++)
    {
        if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(i + 1) != ' '))
            i++;
        else
            result = isdigit(arg.at(i));
    }
    return result;
}

链接到整个程序代码: https://pastebin.com/04pfE55N

1 个答案:

答案 0 :(得分:0)

答案非常简单,我的错误:SEGFAULT正在向我指出从内存中读取错误segmentation fault, wiki

段错误何时发生? 当我的函数StringIsDigit()试图弄清楚超过2个字符的负值是否为整数时。在&#34; if语句中,当检查字符串是否确实是一个整数时,比如-100&#34;,我继续读取字符串,直到我到达arg字符串的末尾,但是使用arg.at(i + 1)。导致代码尝试访问字符串数组外的内存。感谢 Struthersneil 找到这个漏洞!

请查看我的旧StringIsDigit(),找出我犯的一个值错误:

bool StringIsDigit(string arg)
{
    bool result = true;
    for (int i = 0; i < arg.size() && result == true; i++)
    {
        if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(i + 1) != ' '))
            i++;
        else
            result = isdigit(arg.at(i));
    }
    return result;
}

解决方案 解决方案我想确保字符串是一个整数,因为我的算法支持表达式,例如x + 3。这意味着我需要遍历字符串,在字符串数组中的每个字符上调用isdigit()。虽然&#39; - &#39;不是整数,&#39; - &#39;显然需要表达一个负整数,所以我在我的旧StringIsDigit()中看到了一个有缺陷的检查。我没有使用那个条件if语句,而是检查了第一个字符&#39; - &#39;而第二个不是空白&#39; &#39;,然后我让isdigit()函数完成剩下的工作。

bool StringIsDigit(string arg)
{
    bool result = true;
    //I only need to check if the first is a '-' char and
    //the next char is not ' '.
    for (int i = 0; i < arg.size() && result == true; i++)
    {
        if ((arg.size() != 1) && (arg.at(0) == '-') && (arg.at(1) != ' '))
            i++;
        else
            result = isdigit(arg.at(i));
     }
     return result;
}