后缀评估C.

时间:2013-03-13 03:41:27

标签: c arrays

我正在努力让这个“计算器”类型程序工作。

我输入一个转换为后缀表示法的算术表达式。 (没什么大不了的,我以前的那个工作)

但是,我无法评估该死的后缀表示法!如果你在main中检查第一个while循环,你会看到我得到分段错误的地方。

如果有人有任何想法,我会欣赏一些指针(笑)。

由于

3 个答案:

答案 0 :(得分:0)

int j;

while((ch=postnot[j]) !='\0')

你没有初始化j,所以它可能是20亿到20亿之间的任何东西。此外,我不认为代码会起作用,因为你没有在正确的范围内增加j。

答案 1 :(得分:0)

请不要使用“**”来标记代码中的错误。如果您想在示例代码中引起读者注意,请使用注释。

轻微,但你缺少一个标题,ctype.h为isdigit()。调高编译器警告级别以帮助您诊断这些事情。

不要尝试以这种方式递增:j=j++;这是未定义的行为。只需使用j++;代替。

你真的不应该使用gets()。它是很久以前的遗物,不应该在新代码中使用。从它的手册页:

  

无法安全使用gets()函数。因为缺乏   边界检查,以及调用程序无法可靠   确定下一个传入线的长度,使用此   功能使恶意用户可以随意改变运行   程序通过缓冲区溢出攻击的功能。它是   强烈建议在所有情况下都使用fgets()函数。

我认为您应该仔细检查您对堆栈数据结构的尝试,特别是在调用push / pop之前的初始化。你有责任进行边界检查,并检查push()到一个已满的堆栈,pop()来自一个空的,初始化堆栈以供第一次使用,等等。你的代码忽略了这些问题。

还有更多,但我一直绊倒更多的地方,你通过将星号放入其中来破坏你的例子。

我不禁觉得你可以避免这个问题,或者至少通过先修复明显的编译警告/错误结果来自行解决这个问题。

答案 2 :(得分:0)

您的代码包含很多错误。

  • top定义为-1,您正在访问stack[top] 打印

  • 如果要在特定索引处打印字符,而不是字符串 然后你必须在%c而不是printf

  • 中使用%s
  • 您没有在j循环中修改变量while,也没有在进入循环之前提取j

我纠正了你的一些错误,请试试这个

  printf("\nPostfix Notation = %s\n",postnot);
  int j = 0;

 while((ch=postnot[j]) !='\0'){     //THIS IS WHERE I GET SEGMENTATION FAULT 
                           //CORE DUMPED WHILE DEBUGGING
    if(isdigit(ch))
    {
       push(ch - '0');
    }
   else
    {   op2=pop();
        op1=pop();
      switch(ch)
        {
            case '+':push(op1+op2);break;
            case '-':push(op1-op2);break;
            case '*':push(op1*op2);break;
            case '/':push(op1/op2);break;
        }
    }
    j++;
  }
  printf("\nANSWER= %d\n",pop());
相关问题