C ++终止被叫'std :: length_error'?

时间:2017-07-23 19:59:38

标签: c++ compiler-errors std terminate

这是我得到的错误:

  

在抛出'std :: length_error'

的实例后终止调用      

what():basic_string :: _ S_create

     

中止(核心倾销)

我正在阅读一个大约有50行的文件。你在下面的代码中看到了这个问题吗?

using namespace std;

bool areParenthesesBalanced(const std::string& expr)
{
    stack<char> s;
    char a, b, c;

    for (int i=0; i<expr.length(); i++)
    {
        if (expr[i]=='(' || expr[i]=='[' || expr[i]=='{')
        {
            s.push (expr[i]);
        }
        else
        {
            switch (expr[i])
            {
                case ')':
                a = s.top();
                s.pop();
                if (a=='{' || a=='[')
                cout<<"Not Balanced";
                break;

                case '}':
                b = s.top();
                s.pop();
                if (b=='(' || b=='[')
                cout<<"Not Balanced";
                break;

                case ']':
                c = s.top();
                s.pop();
                if (c=='(' || c=='{')
                cout<<"Not Balanced";
                break;
            }
        }
    }

    if (s.empty())  //check if stack is empty
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    std::ifstream t("prog1.cpp");
    std::string str;
    t.seekg(0, std::ios::end);
    str.reserve(t.tellg());
    t.seekg(0, std::ios::beg);
    str.assign((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());

    if(areParenthesesBalanced(str))
    {
        cout<<"Balanced";
    }
    else
    {
        cout<<"Not Balanced";
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的问题:

要执行std::string::assign,字符串必须resize d才能包含该范围,而不是reserve d。不过,std::string::appendstd::copystd::back_inserter会有效。

其他:

在访问/弹出其顶部元素之前,您没有检查堆栈是否为空。

也许你想要return一些东西,而不是cout<<"Not Balanced";中的areParenthesesBalanced

没有错误:

您可以使循环仅包含switch语句。

我认为您不需要任何abc变量。在与pop进行所有比较后,您应std::stack::top

最后,请写下return s.empty();而不是六行。

答案 1 :(得分:-1)

如果堆栈为空,则会抛出错误。请在使用前加上条件。还要对代码进行一些修改。这可能有用......

使用namespace std;

    bool areParenthesesBalanced(const std::string& expr)
    {
        stack<char> s;
        char a, b, c;

        for (int i=0; i<expr.length(); i++)
        {
            if (expr[i]=='(' || expr[i]=='[' || expr[i]=='{')
            {
                s.push (expr[i]);
            }
            else
            {
                switch (expr[i])
                {
                    case ')':
                    a = s.top();
                    s.pop();
                    if (a=='{' || a=='[')
                    cout<<"Not Balanced";
                    break;

                    case '}':
                    b = s.top();
                    s.pop();
                    if (b=='(' || b=='[')
                    cout<<"Not Balanced";
                    break;

                    case ']':
                    c = s.top();
                    s.pop();
                    if (c=='(' || c=='{')
                    cout<<"Not Balanced";
                    break;
                }
            }
        }

        if (s.empty())  //check if stack is empty
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    int main()
    {
        std::ifstream t("prog1.cpp");
        std::string str;
        t.seekg(0, std::ios::end);
        str.resize(t.tellg());
        t.seekg(0, std::ios::beg);
        str.assign((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());

        if(areParenthesesBalanced(str))
        {
            cout<<"Balanced";
        }
        else
        {
            cout<<"Not Balanced";
        }
        return 0;
    }