gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:44:45 25 4
gpt4 key购买 nike

我一直在研究一个基本的计算器,它可以接受复杂的数学表达式,例如:(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/

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