2015-02-05 33 views
-5

我試圖解決一個後綴表達式,但我不明白爲什麼它給運行時錯誤。 代碼:任何人都可以找到爲什麼該程序解決後綴表達給運行時錯誤

#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

'給運行時錯誤'好心解釋。 –

+1

歡迎來到Stack Overflow!請參考[遊覽](http://stackoverflow.com/tour)並閱讀[如何提問](http://stackoverflow.com/help/how-to-ask)以瞭解我們對問題的期望。 –

+0

請正確格式化您的代碼。你已經提出了一個請求,但是你的問題是什麼? –

回答

0

你的代碼是幾乎 readble,不過,我認爲,你需要改變

scanf("%c",a[j]); 

scanf(" %c",&a[j]); //note the space before %c, and scanf() expects pointer 

  1. &因爲每scanf()簽名,它需要添加請存儲以存儲掃描結果。
  2. 前導空格[]停止掃描先前按下的回車鍵[\n]鍵。

請查閱的scanf()瞭解更多詳情。

此外,如先生提到@LPs的回答中,push(atoi(a));使用是很危險的,萬一a是不是空終止。

0

Chnage scanf("%c",a[j]);scanf("%c",&a[j]);。你需要傳遞地址來存儲char的值。此外,您還需要在每次輸入stdin後丟棄額外的字符。

+0

仍然不能正常工作 – identicon

+0

我指出了我看到的第一個運行時錯誤。有關更多細節,請調試您的代碼。一步一步運行它。 – Abhineet

0

我認爲指令push(atoi(a));是不安全的,因爲該數組不是零初始化,比atoi可以陷入未定義的行爲。

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

相關問題