我试图解决后缀表达式,但我不明白为什么它会给出运行时错误。 代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
struct stack
{
int top;
int n[100];
}s;
void push(int a)
{
s.n[s.top+1]=a;
s.top++;
}
void pop(char a)
{
int c,b;
b=s.n[s.top];
c=s.n[s.top-1];
s.top--;
switch(a)
{
case '+':
s.n[s.top]=b+c;
break;
case '-':
s.n[s.top]=b-c;
break;
case '*':
s.n[s.top]=b*c;
break;
case '/':
s.n[s.top]=b/c;
break;
}
}
int main()
{
s.top=-1;
int m,i,k;
char a[100],c[100];
scanf("%d",&m);
for(i=0;i<m;i++)
{
int j=0;
while(1)
{
scanf("%c",a[j]);
if(a[j]=='?')
break;
else if(a[j]==' ')
{
push(atoi(a));
}
else if(a[j]=='+'||'-'||'*'||'/')
{
pop(a[j]);
}
else
{
j++;
}
}
printf("%d",s.n[s.top]);
}
}
答案 0 :(得分:0)
将scanf("%c",a[j]);
更改为scanf("%c",&a[j]);
。您需要传递地址以存储char的值。此外,您还需要在每次从标准输入输入后丢弃额外的字符。
答案 1 :(得分:0)
您的代码几乎无法读取,我认为您需要更改
scanf("%c",a[j]);
到
scanf(" %c",&a[j]); //note the space before %c, and scanf() expects pointer
的
&
因为根据scanf()
签名,它需要地址来存储扫描结果。
]停止扫描先前按下的ENTER [\n
]键。请查看scanf()
的{{3}}了解详情。
另外,正如 @LPs 先生的回答中提到的那样,push(atoi(a));
的使用非常危险,以防a
未终止。
答案 2 :(得分:0)
我认为指令push(atoi(a));
不安全,因为数组初始化不是零,而atoi可能会陷入未定义的行为。
另一件事是,对于带有%c的scanf,你可以接受使atoi失败的所有字符(例如a,b,c)。