我正在努力让这个“计算器”类型程序工作。
我输入一个转换为后缀表示法的算术表达式。 (没什么大不了的,我以前的那个工作)
但是,我无法评估该死的后缀表示法!如果你在main中检查第一个while循环,你会看到我得到分段错误的地方。
如果有人有任何想法,我会欣赏一些指针(笑)。
由于
答案 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());