紧急求救!!Segmentation Fault !!!各位大哥救命啊……

xsbailong 2011-04-14 12:18:57
原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2483
提交以后提示Segmentation Fault ……到底哪里错了啊……
希望各位高手帮帮忙啊……
题意大概是输入类似( V | V ) & F & ( F| V)的表达式然后判断真假(V代表true)


//zoj2483
#include <iostream>
#include <stack>
using namespace std;

char And(char m,char n)
{
if(m=='V'&&n=='V') {m='V';return m;}
else {m='F';return m;}
}
char Or(char m,char n)
{
if(m=='F'&&n=='F') {m='F';return m;}
else {m='V';return m;}
}
char Fei(char m)
{
if(m=='V') {m='F';return m;}
else {m='V';return m;}
}

int main()
{
char a;
char g[21];
int j=1;
while(cin>>a)
{
int i=0;
char t,m,n,re;
stack <int>s;
stack <int>y;
if(a!=' ')
{g[i]=a;i++;}
while(cin.get(a)&&a!='\n')
{
if(a!=' ')
{
g[i]=a;
i++;
}
}
g[i]='\0';
i=0;
while(g[i]!='\0')
{
if(g[i]=='V'||g[i]=='F')
s.push(g[i]);
else
{
switch(g[i])
{
case '&':if(y.empty()||y.top()=='|'||y.top()=='(')
y.push(g[i]);
else
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
y.push(g[i]);
}break;
case '!':if(y.empty()||y.top()=='|'||y.top()=='('||y.top()=='&') y.push(g[i]);
else
{
y.pop();
m=s.top();
s.pop();
re=Fei(m);
s.push(re);
y.push(g[i]);
}
break;
case '|':if(y.empty()||y.top()=='(') y.push(g[i]);
else
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
y.push(g[i]);
}
break;
case '(':y.push(g[i]);
break;
case ')':
while(y.top()!='(')
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
}
y.pop();
}
}
i++;
}
while(!y.empty())
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
}
t=s.top();
s.pop();
cout<<"Expression "<<j<<":"<<t<<endl;
j++;
}
return 0;
}
...全文
215 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsbailong 2011-04-14
  • 打赏
  • 举报
回复
最新修改如下:
我也知道数组越界访问,指针非法访问之类的问题……可找不到错在哪啊 麻烦大家帮忙找下啊……
//zoj2483
#include <iostream>
#include <stack>
using namespace std;

char And(char m,char n)
{
if(m=='V'&&n=='V') {m='V';return m;}
else {m='F';return m;}
}
char Or(char m,char n)
{
if(m=='F'&&n=='F') {m='F';return m;}
else {m='V';return m;}
}
char Fei(char m)
{
if(m=='V') {m='F';return m;}
else {m='V';return m;}
}

int main()
{
char a;
char g[101];
int j=1;
while(cin>>a)
{
int i=0;
char t,m,n,re;
stack <int>s;
stack <int>y;
if(a!=' ')
{g[i]=a;i++;}
while(cin.get(a)&&a!='\n')
{
if(a!=' ')
{
g[i]=a;
i++;
}
}
g[i]='\0';
i=0;
while(g[i]!='\0')
{
if(g[i]=='V'||g[i]=='F')
s.push(g[i]);
else
{
switch(g[i])
{
case '&':if(y.empty()||y.top()=='|'||y.top()=='(')
y.push(g[i]);
else
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
y.push(g[i]);
}break;
case '!':if(y.empty()||y.top()=='|'||y.top()=='('||y.top()=='&') y.push(g[i]);
else
{
y.pop();
m=s.top();
s.pop();
re=Fei(m);
s.push(re);
y.push(g[i]);
}
break;
case '|':if(y.empty()||y.top()=='(') y.push(g[i]);
else
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
y.push(g[i]);
}
break;
case '(':y.push(g[i]);
break;
case ')':
while(y.top()!='(')
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
}
y.pop();
}
}
i++;
}
while(!y.empty())
{
t=y.top();
y.pop();
if(t=='!') {m=s.top();s.pop();re=Fei(m);s.push(re);}
else if(t=='&') {m=s.top();s.pop();n=s.top();s.pop();re=And(m,n);s.push(re);}
else if(t=='|') {m=s.top();s.pop();n=s.top();s.pop();re=Or(m,n);s.push(re);}
}
t=s.top();
s.pop();
cout<<"Expression "<<j<<":"<<t<<endl;
j++;
}
return 0;
}
pathuang68 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xsbailong 的回复:]

我编译没错啊,测了一些数据也没错的……调试了,好像也没报错啊……
[/Quote]

1楼说得对的。绝大部分情况下,要么事数组越界访问,要么是指针非法访问。
xsbailong 2011-04-14
  • 打赏
  • 举报
回复
我编译没错啊,测了一些数据也没错的……调试了,好像也没报错啊……
luciferisnotsatan 2011-04-14
  • 打赏
  • 举报
回复
单步调试下
Segmentation Fault 通常是 数组越界,指针问题等造成的
xsbailong 2011-04-14
  • 打赏
  • 举报
回复
问题是我自己运行、调试都不出错啊……只是在oj那里老是报错,我都还没找到个错误的例子……大家提供个出错的例子也好啊……
赵4老师 2011-04-14
  • 打赏
  • 举报
回复
出错时选取消进入调试按Alt+7键查看Call Stack
xsbailong 2011-04-14
  • 打赏
  • 举报
回复
没装linux……
v2002750 2011-04-14
  • 打赏
  • 举报
回复
GDB单步调试
xsbailong 2011-04-14
  • 打赏
  • 举报
回复
自己顶下,各位大牛前来相救啊……快郁闷死了……
RabbitLBJ 2011-04-14
  • 打赏
  • 举报
回复
不好意思,看了说明了,一切正常。。。。
RabbitLBJ 2011-04-14
  • 打赏
  • 举报
回复
楼主什么编译器??我VS2005编译通过了,可以运行。只是还不清楚你这程序怎么用哈,随便输入了点东西,貌似不对。。。。汗一个

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧