C 中带堆栈的计算器分段错误(核心已转储)

Calculator with stack in C Segmentation fault (core dumped)

我想做一个可以用逻辑运算符计算的计算器。我创建了两个堆栈,其中一个用于 1 和 0,另一个用于运算符。我也可以编译,但是当我想尝试时,说:"Segmentation fault (core dumped)"。提前谢谢你

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <Stack.h>

#define MAX_EXPR_SIZE 100

int Evaluate01(char *expr) {
    int final, i = 0;

    Stack *stack1 = (Stack *)malloc(sizeof(Stack));
    Stack *stack2 = (Stack *)malloc(sizeof(Stack));
    if(!stack1 || !stack2) {
       //print error and return
    }

    Stack_initialize(stack1);
    Stack_initialize(stack2);


    do {

        if (expr[i] == '0' || expr[i] == '1'){
            int foo3 = expr[i] - '0';
            Stack_Push(stack1, foo3);
        }

        else if (expr[i] == 0x96){
            int foo3 = Stack_Pop(stack1);
            int sum = !foo3;
            Stack_Push(stack1, sum);
        }

        else if (expr[i] == 0x62 ||
                 expr[i] == 0x46 ||
                 expr[i] == 0x43 ||
                 expr[i] == 'x'){

            Stack_Push(stack2, expr[i]);
        }   

        else if (expr[i] == 0x41){
            int sum;
            int foo1= Stack_Pop(stack1);
            int foo2 = Stack_Pop(stack1);
            char op = Stack_Pop(stack2);

            switch(op){
                case 0x62:
                    sum = !foo1 || foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 0x46:
                    sum = foo1 && foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 0x43:
                    sum = foo1 || foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 'x':
                    sum = foo1 ^ foo2;
                    Stack_Push(stack1, sum);
                    break;
            }
        }

        i++;
    }while (expr[i] != '[=10=]');
     final = Stack_Pop(stack1);
     free(stack1);
     free(stack2);
     return final;
}

int main(int argc, char *argv[]) {

    char expr[MAX_EXPR_SIZE+1];

    while(1) {

        printf("logical expression : ");
        scanf(" %s", expr);

        printf("results: ");
        printf("%d\n", Evaluate01(expr));
    }

    return 0;
}

编辑:现在可以了。非常感谢!

首先,当您使用字符及其 ascii 值之间的比较时,您应该使用六进制。例如:

expr[i] == 62

应该写成:

expr[i] == 0x62

其次,将字符转换为 int 时应该使用 atoi。

此外,您应该首先检查分配是否成功。 最后,while 迭代应该循环 while expr[i] != NULL.

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <Stack.h>

#define MAX_EXPR_SIZE 100

int Evaluate01(char *expr) {
    int i = 0;
    Stack *stack1 = (Stack *)malloc(sizeof(Stack));
    Stack *stack2 = (Stack *)malloc(sizeof(Stack));
    if(!stack1 || !stack2) {
       //print error and return
    }

    Stack_initialize(stack1);
    Stack_initialize(stack2);


    do {

        if (expr[i] == '0' || expr[i] == '1'){
            int foo3 = atoi(expr[i] - '0');
            Stack_Push(stack1, foo3);
        }

        else if (expr[i] == 0x96){
            int foo3 = Stack_Pop(stack1);
            int sum = !foo3;
            Stack_Push(stack1, sum);
        }

        else if (expr[i] == 0x62 ||
                 expr[i] == 0x46 ||
                 expr[i] == 0x43 ||
                 expr[i] == 0x120){

            Stack_Push(stack2, expr[i]);
        }   

        else if (expr[i] == 0x41){
            int sum;
            int foo1= Stack_Pop(stack1);
            int foo2 = Stack_Pop(stack1);
            char op = Stack_Pop(stack2);

            switch(op){
                case 0x62:
                    sum = !foo1 || foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 0x46:
                    sum = foo1 && foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 0x43:
                    sum = foo1 || foo2;
                    Stack_Push(stack1, sum);
                    break;

                case 0x120:
                    sum = foo1 ^ foo2;
                    Stack_Push(stack1, sum);
                    break;
            }
        }

        i++;
    }while (expr[i] != NULL);

    free(stack1);
    free(stack2);
}

int main(int argc, char *argv[]) {

    char expr[MAX_EXPR_SIZE+1];

    while(1) {

        printf("logical expression : ");
        scanf(" %s", expr);

        printf("results: ");
        printf("%d\n", Evaluate01(expr));
    }

    return 0;
}