简单C计算器中的细分错误

时间:2019-03-13 23:13:01

标签: c

我在尝试创建的简单c计算器中遇到了细分错误。该计算器应该采用带+,x和方括号的公式,并输出答案。该实现基于两个作为堆栈工作的数组,一个操作数堆栈和一个值堆栈。我正在努力解决细分错误。我已经附上了下面的代码。

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

void pushValStack(int stack[], int *top, int value){
   *top++;
   stack[*top] = value;
}

int popValStack(int stack[], int *top){
   *top--;
   return stack[*top];
}

void pushOpStack(char *stack[], int *top, char *value){
   *top++;
   stack[*top] = value;
}

char *popOpStack(char *stack[], int *top){
   *top--;
   return stack[*top];
}

int main(int argc, char *argv[]){
   char *token;
   int tokenNumber = 1;
   int value[51];
   int *valueTop = 0;
   int valueOne,valueTwo;
   char *operand[51];
   int *operandTop = 0;
   char *operandOne;

   token = argv[tokenNumber];
   while (token != NULL){
      if (*token == '+' || *token == 'x' || *token == '['){
         pushOpStack(operand, operandTop, token);
      }
      else if (*token == ']'){
         while (*operand[*operandTop] != '['){
            operandOne = popOpStack(operand, operandTop);
            if (*operandOne == '+'){
               valueOne = popValStack(value, valueTop);
               valueTwo = popValStack(value, valueTop);
               pushValStack(value, valueTop, valueOne + valueTwo);
            }
            if (*operandOne == 'x'){
               valueOne = popValStack(value, valueTop);
               valueTwo = popValStack(value, valueTop);
               pushValStack(value, valueTop, valueOne * valueTwo);
            }
         }
      }
      else {
         pushValStack(value, valueTop, atoi(token));
      }
      tokenNumber++;
      token = argv[tokenNumber];
   }
   while (*operandTop != 0){
      operandOne = popOpStack(operand, operandTop);
      if (*operandOne == '+'){
         valueOne = popValStack(value, valueTop);
         valueTwo = popValStack(value, valueTop);
         pushValStack(value, valueTop, valueOne + valueTwo);
      }
      if (*operandOne == 'x'){
         valueOne = popValStack(value, valueTop);
         valueTwo = popValStack(value, valueTop);
         pushValStack(value, valueTop, valueOne * valueTwo);
      }
   }
   printf("\n%d",popValStack(value, valueTop));
}

2 个答案:

答案 0 :(得分:0)

operandTop是类型int*的指针变量。您将其初始化为0(空指针),并且永远不会为其分配其他值。取消引用的任何尝试都将导致不确定的行为,可能是分段错误。

我在没有命令行参数的调试器下运行了程序,该程序在第61行while (*operandTop != 0){上死了

答案 1 :(得分:0)

您要声明多个int*变量,但不要为其分配任何内存。它们应该改为int,因为它们包含堆栈中的索引。

int valueTop = 0;
int operandTop = 0;

然后,您应该使用这些变量,而无需取消引用它们。但是,当将它们传递给需要更新变量的函数时,必须传递变量的地址。

int main(int argc, char *argv[]){
    char *token;
    int tokenNumber = 1;
    int value[51];
    int valueTop = 0;
    int valueOne,valueTwo;
    char *operand[51];
    int operandTop = 0;
    char *operandOne;

    token = argv[tokenNumber];
    while (token != NULL){
        if (*token == '+' || *token == 'x' || *token == '['){
            pushOpStack(operand, &operandTop, token);
        }
        else if (*token == ']'){
            while (*operand[operandTop] != '['){
                operandOne = popOpStack(operand, &operandTop);
                if (*operandOne == '+'){
                    valueOne = popValStack(value, &valueTop);
                    valueTwo = popValStack(value, &valueTop);
                    pushValStack(value, &valueTop, valueOne + valueTwo);
                }
                if (*operandOne == 'x'){
                    valueOne = popValStack(value, &valueTop);
                    valueTwo = popValStack(value, &valueTop);
                    pushValStack(value, &valueTop, valueOne * valueTwo);
                }
            }
        }
        else {
            pushValStack(value, &valueTop, atoi(token));
        }
        tokenNumber++;
        token = argv[tokenNumber];
    }
    while (operandTop != 0){
        operandOne = popOpStack(operand, &operandTop);
        if (*operandOne == '+'){
            valueOne = popValStack(value, &valueTop);
            valueTwo = popValStack(value, &valueTop);
            pushValStack(value, &valueTop, valueOne + valueTwo);
        }
        if (*operandOne == 'x'){
            valueOne = popValStack(value, &valueTop);
            valueTwo = popValStack(value, &valueTop);
            pushValStack(value, &valueTop, valueOne * valueTwo);
        }
    }
    printf("\n%d",popValStack(value, &valueTop));
}