2015-09-14 94 views
-5

這是我的程序,使用堆棧將表達式從後綴轉換爲中綴。我沒有得到任何錯誤,但在運行時,編譯器說Segmentation Fault - Core Dumped。我認爲這與指向垃圾值的指針有關。如何tracebck到這個流氓指針?另外,有沒有更好的方法將Postfix轉換爲中綴?分割錯誤 - 核心轉儲

#include<iostream> 
#include<string.h> 
#include<stdio.h> 
#include<math.h> 
class StringStack 
{ 
    public: 
    char arr[20][20]; 
    int top; 
    StringStack() 
    {top=-1; arr[20][20]={NULL};} 
    void push(char* a) 
    {strcpy(arr[++top],a);} 
    char* pop() 
    {return arr[top--];} 
}; 
void paranthesise(char a[]) 
{ 
    int l = strlen(a); 
    a[l+2] = '\0'; 
    for(int i=l; i>=0; i++) 
     a[i] = a[i-1]; 
    a[0] = '('; 
    a[l+1] = ')'; 

} 
using namespace std; 
int main() 
{ 
    char temp[1]; 
    char postfix[20] = ""; 
    char temp2[10] = ""; 
    char temp3[10] = ""; 
    StringStack s1; 
    cout<<"Enter Postfix Expression: "<<endl; 
    gets(postfix); int l = strlen(postfix); 
    for(int i=0; i<l; i++) 
    { 
     if(postfix[i]!='*'&&postfix[i]!='/'&&postfix[i]!='+'&&postfix[i]!='-') 
     { 
      temp[0]=postfix[i]; 
      s1.push(temp); 
     } 
     else 
     { 
      strcpy(temp2,s1.pop()); 
      strcpy(temp3,s1.pop()); 
      switch(postfix[i]) 
      { 
       case'*': 
        temp[0]='*'; break; 
       case'/': 
        temp[0]='/'; break; 
       case'+': 
        temp[0]='+'; break; 
       case'-': 
        temp[0]='-'; break; 

       default: cout<<"Error"; break; 
      } 
      strcat(temp3,temp); 
      strcat(temp3,temp2); 
      paranthesise(temp3); 
      s1.push(temp3); 
     } 
    } 
    strcpy(temp2,s1.pop()); 
    cout<<"\nInfix:"; 
    puts(temp2); 
    return 0; 
} 
+1

可能的重複項:[#1](http://stackoverflow.com/q/20612172),[#2](http://stackoverflow.com/q/22546079),[#3](http:/ /stackoverflow.com/q/4363133)。 –

+0

在'paranthesise'中:'for(int i = l; i> = 0; i ++)'我猜你在這裏想要'我 - '。 – user657267

+1

*「另外,有沒有更好的方法將Postfix轉換爲中綴?」*太寬泛。 –

回答

2

的問題,我發現:

一個

arr[20][20]={NULL}; 

是錯誤的。這將NULL分配給arr[20][20],這不是數組的有效元素。你正在設置你不應該記憶的值。 arr的有效元素是arr[0][0] - arr[19][19]

這本身就足以讓程序展現未定義的行爲。當您使用

char temp[1]; 

它所能容納的唯一有效的字符串是空字符串

StringStack() : arr{}, top(-1) {} 

兩個

我會構造改變。既然你打算用它持有一個字符串由一個字符,你需要使用:

char temp[2] = ""; // Doesn't have to be 2 but it has to be 
        // greater than 1. 

paranthesise,您有:

for(int i=l; i>=0; i++) 

需要被:

for(int i=l; i>=0; i--) 

否則,您不斷修改數組而不滿足標準來結束循環。不僅如此,您還最終修改了超出有效限制的數組。