写的四则运算总提示段错误,求帮助

C++语言 码拜 4年前 (2016-09-21) 398次浏览
以下一段代码,编译没查出问题,执行时提示段错误,用gdb调试又提示program received signal sigsegv,搜了很多例子都和这个不太像,实在搞糊涂了,求高手帮忙!
#include <iostream>
#include <stack>
#include <string>
#include <cstring>
using namespace std;
class Exp
{
stack<char> ops;//运算符栈
stack<double> ds;//数据栈
double v,lh,rh;//计算结果和临时操作数变量
char op;//运算符
public:
double calinput()//读取并计算表达式直到结束为止
{
do
{
readdata();//读取数据
skipspace();//跳过空白
}
while(readop());//读取运算符
calremain();//处理栈中剩余的运算符
return v;
}
void readdata()
{
while(!(cin>>v))//读取数据失败应该只能是左括号”(”
{
cin.clear();
cin>>op;//读取”(”
if(op!=”(“) throw string(“在该出现数值的地方遇到”)+op;
ops.push(op);
}
ds.push(v);
}
void skipspace()//跳过空格
{
while(cin.peek()==” “) cin.ignore();
}
bool readop()//读取运算符,可能遇到右括号”)”或‘\n”
{
while((op=cin.get())==”)”)
{
while(ops.top()!=”(“)//找栈中的左括号
{
rh=ds.top();ds.pop();//从栈中取得右操作数
lh=ds.top();ds.pop();//从栈中取得左操作数
ds.push(cal(lh,ops.top(),rh));//计算并且入栈
ops.pop();
}
ops.pop();//丢弃左括号
}
if(op==”\n”) return false;
if(strchr(“+-*/”,op)==NULL)//无效运算符
throw string(“无效运算符”)+op;
while(!ops.empty()&&ops.top()!=”(“&&prior(op,ops.top()))
{
rh=ds.top();ds.pop();//从栈中取得右操作数
lh=ds.top();ds.pop();//从栈中取得左操作数
ds.push(cal(lh,ops.top(),rh));//计算并且入栈
ops.pop();
}
ops.push(op);
return true;
}
void calremain()
{
while(!ops.empty())
{
rh=ds.top();ds.pop();
lh=ds.top();ds.pop();
ds.push(cal(lh,ops.top(),rh));
ops.pop();
}
if(ds.size()!=1) throw string(“无效的表达式”);
v=ds.top();
ds.pop();
}
double cal(double lh,char op,double rh)
{
return op==”+”?lh+rh:op==”-“?lh-rh:op==”*”?lh*rh:lh/rh;
}
bool prior(char o1,char o2)
{
return o1!=”+”&&o1!=”-“&&o2!=”*”&&o2!=”/”;
}
};
int main()
{
Exp e;
try
{
cout<<e.calinput()<<endl;
}
catch(const string& e)
{
cout<<e<<endl;
}
return 0;
}
解决方案

20

gdb 的,bt 可以看到调用堆栈,看看哪里出错了。

20

 对于不正确的内存处理,计算机程序可能抛出SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用程序通告错误,由此,开发者可以使用它来调试程序或处理错误。
在一个程序接收到SIGSEGV时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或执行一些其他特定于某些平台的动作。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明写的四则运算总提示段错误,求帮助
喜欢 (0)
[1034331897@qq.com]
分享 (0)