任何人都可以找到为什么程序解决后缀表达式给出运行时错误

时间:2015-02-05 07:05:21

标签: c

我试图解决后缀表达式,但我不明白为什么它会给出运行时错误。 代码:

#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]);
    }
}

3 个答案:

答案 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

  1. &因为根据scanf()签名,它需要地址来存储扫描结果。
  2. 前导空格[]停止扫描先前按下的ENTER [\n]键。
  3. 请查看scanf()的{​​{3}}了解详情。

    另外,正如 @LPs 先生的回答中提到的那样,push(atoi(a));的使用非常危险,以防a未终止。

答案 2 :(得分:0)

我认为指令push(atoi(a));不安全,因为数组初始化不是零,而atoi可能会陷入未定义的行为。

另一件事是,对于带有%c的scanf,你可以接受使atoi失败的所有字符(例如a,b,c)。