0

我很高兴尝试让这个“计算器”类型的程序工作。

我输入了一个算术表达式,它被转换为后缀表示法。(没什么大不了的,我去年就开始工作了)

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

如果有人有任何想法,我将不胜感激(大声笑)。

谢谢

4

3 回答 3

0
int j;

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

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

于 2013-03-13T04:03:46.827 回答
0

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

次要的,但是您缺少用于 isdigit() 的标头 ctype.h。调高编译器警告级别以帮助您诊断这些问题。

不要试图以这种方式增加:j=j++; 这是未定义的行为。改用就好j++;了。

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

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

我认为您应该仔细检查您对堆栈数据结构的尝试所做的事情,尤其是在调用 push/pop 之前的初始化。您有责任进行边界检查,检查 push() 到已满的堆栈,从空的堆栈中检查 pop(),初始化堆栈以供首次使用等。您的代码忽略了这些问题。

还有更多,但我不断在更多的地方绊倒,在这些地方你通过在其中添加星号而破坏了你的示例。

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

于 2013-03-13T04:03:55.783 回答
0

您的代码包含很多错误。

  • top被定义为-1并且您正在访问stack[top]以进行打印

  • 如果您在特定索引处打印字符,而不是字符串,那么您必须使用%cinprintf而不是%s

  • 您没有jwhile循环内修改变量,也没有j在进入循环之前进行intilizing

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

  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());
于 2013-03-13T04:04:13.790 回答