gpt4 book ai didi

c++ - C++终止称为 'std::length_error'?

转载 作者:行者123 更新时间:2023-12-02 11:13:11 26 4
gpt4 key购买 nike

这是我得到的错误:

terminate called after throwing an instance of 'std::length_error'

what(): basic_string::_S_create

Aborted (core dumped)



我正在读取一个大约有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;
}

最佳答案

您的问题:

要执行std::string::assign,字符串必须是resize d才能包含该范围,而不是reserve d。不过,std::string::append或带有std::copystd::back_inserter都可以使用。

其他:

在访问/ pop 栈顶元素之前,您无需检查栈是否为空。

也许您想用return代替在cout<<"Not Balanced";中进行areParenthesesBalanced

没有错误:

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

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

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

关于c++ - C++终止称为 'std::length_error'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com