teio931226 2023-03-29 09:59 采纳率: 100%
浏览 18
已结题

在编写实现布尔表达式的程序时出现Segmentetionfault报错

在编写实现布尔表达式的程序时出现Segmentetion fault报错,是哪个指针出问题了吗?

img


这是题目

img


img

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct op{
    char ch[1000];
    int top;
};
struct data{
    char data[1000];
    int top;
};
void add(op *p,data *q){
    char a,b,c;
    c=p->ch[p->top];
    p->top--;
    if(c!='!'){
        a=q->data[q->top];
        q->top--;
        b=q->data[q->top];
        q->top--;
        if(c=='&'){
            if(a=='V'&&b=='V'){
                q->top++;
                q->data[q->top]='V';
            }
            else{
                q->top++;
                q->data[q->top]='F';
            }
        }
        else if(c=='|'){
            if(a=='F'&&b=='F'){
                q->top++;
                q->data[q->top]='F';
            }
            else{
                q->top++;
                q->data[q->top]='V';
            }
        }
    }
    else if(c=='!'){
        a=q->data[q->top];
        q->top--;
        if(a=='V'){
            q->top++;
            q->data[q->top]='F';
        }
        else if(a=='F'){
            q->top++;
            q->data[q->top]='V';
        }
    }
}
int main(){
    op *p=(op*)malloc(sizeof(op));
    p->top=-1;
    data *q=(data*)malloc(sizeof(data));
    q->top=-1;
    char s[1005];
    int len;
    while(gets(s)){
        len=strlen(s);
        for(int i=0;i<len;i++){
            if(s[i]=='V'||s[i]=='F'){
                q->top++;
                q->data[q->top]=s[i];
            }
            else if(s[i]=='('||s[i]=='!'||p->top==-1){
                p->top++;
                p->ch[p->top]=s[i];
            }
            else if(s[i]=='&'){
                if(p->ch[p->top]=='('||p->ch[p->top]=='|'){
                    p->top++;
                    p->ch[p->top]=s[i];
                }
                else{
                    while(p->ch[p->top]!='('&&p->ch[p->top]!='|'){
                        add(p,q);
                        if(p->top==-1) break;
                    }
                    p->top++;
                    p->ch[p->top]=s[i];
                }
            }
            else if(s[i]=='|'){
                if(p->ch[p->top]=='('){
                    p->top++;
                    p->ch[p->top]=s[i];
                }
                else{
                    while(p->ch[p->top]!='('){
                        add(p,q);
                        if(p->top==-1) break;
                    }
                    p->top++;
                    p->ch[p->top]=s[i];
                }
            }
            else if(s[i]==')'){
                while(p->ch[p->top]!='('){
                    add(p,q);
                }
                p->top--;
            }
        }
        while(p->top!=1){
            add(p,q);
        }
        printf("%c\n",q->data[q->top]);
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-29 10:06
    关注

    指针的问题,或者数组越界,或者q->data是无效指针

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月29日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line