c-反向抛光符号计算器错误

时间:2015-03-09 01:46:16

标签: c stack calculator reverse polish

所以我不断收到消息无效的表达" ..."如果我键入./rpcalc" ...&#34 ;,总线错误(核心转储)如果我只是输入命令行./rpcalc 1我得到分段错误(核心转储)消息。这是我的完整代码,我将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define max 10
#define NUMBER 'n'



int main(int argc, char *argv[])
{
  double tmp;
   char c;

  if(argc <= 1) {
    fprintf(stderr,"invalid call\n");
    return 1;
  }

    while(--argc)
       {
         c = getop(*++argv);
        switch(c)
          {
         case NUMBER:
          push(atof(*argv));
          break;
         case '+':
          push(pop() + pop());
          break;
         case '-':
          tmp = pop();
          push(pop() - tmp);
          break;
         case '*':
          push(pop() * pop());
          break;
         case '/':
          tmp = pop();

          if(!tmp){
          printf("can't divide by 0\n");
          }
          else{
          push(pop()/tmp);
          }
          break;
         default:
           printf("invalid expression %s\n", *argv);
         }
      }
    printf("%g\n",pop());
    return 0;
}


int push (int stack[max], int *top, int *data)
{
 if(*top == max -1)
    return(-1);
  else
    {
      *top = *top +1;
      stack[*top] = *data;
      return(1);
    }
}

int pop(int stack[max], int *top, int *data)
{
  if(*top == -1)
    return(-1);
  else
    {
      *data = stack[*top];
      *top = *top - 1;
      return(1);
    }
}

 static int isNumber(const char *s){
  if(*s == '-' || *s == '+') s++;
  if(*s == '\0'){
    return 0;
  }

  while (isdigit(*s)) s++;

  if(*s == 'e' || *s == 'E'){
    s++;
    while(isdigit(*s)) s++;
  }
  return *s == '\0';
}

int getop(const char *op){
  return isNumber(op) ? NUMBER : *op;
}

1 个答案:

答案 0 :(得分:0)

gcc -Wall -ansi -pedantic

首先,你可能不应该返回一个静态int。返回char或int或unsigned int。

下一步:您正在调用参数不正确的函数:

第28行:

push(atof(*argv));

这不是您定义功能的方式。

int push (int stack[max], int *top, int *data);

它需要一个stack [max]数组,一个int指针和另一个int指针

传递浮动不正确。

实际上看起来几乎所有的函数调用都有不正确的参数。