我试图弄清楚为什么我会出现分段错误,我的猜测是它在我的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
答案 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;
}