2014-10-27 73 views
0

我寫了一個代碼,它必須以兩個字符串作爲輸入。它必須輸出步數(相鄰的字母翻轉或翻轉第一個和最後一個字母),需要一個字轉換爲另一個字。它給出正確的值,直到字符串的大小爲8.如果字符串的大小大於8,則給出分段錯誤。我找不到任何錯誤。任何人都可以請幫助我。提前致謝。這是代碼:由於地圖可能導致分段故障

map<string,int>imap; 

int easyStrings(string a, string b) { 

    //cout<<a<<endl; 
    if(a.compare(b) == 0) 
     return 0; 

    map<string,int>::iterator it = imap.find(a); 
    if(it != imap.end()) 
     return it->second; 

    imap.insert(pair<string,int>(a,-2)); 

    int min = -2; 

    string str = a; 


    str[0] = a[a.length()-1]; 
    str[a.length()-1] = a[0]; 

    it = imap.find(str); 
    if(it == imap.end() || it->second != -2) 
     min = 1 + easyStrings(str,b); 

    for(int i = 0 ; i < a.length()-1; i++) 
    { 
     string check = a; 
     check[i] = a[i+1]; 
     check[i+1] = a[i]; 

     int steps = 0; 
     it = imap.find(check); 
     if(it == imap.end() || it->second != -2)  
     { 
      steps = 1 + easyStrings(check,b); 

      if(steps < min || min ==-2) 
       if(steps > 0) 
        min = steps; 
     } 

    } 

    imap[a] = min; 
    return min; 
} 

我試過使用調試器。我在imap.insert中顯示錯誤(pair(a,-2));.它也給出了一個主要與malloc有關的問題。

它沒有進入無限遞歸。最大輸入字符串的長度有階乘,我只在地圖中找不到字符串時才插入字符串。

+2

那麼,你有沒有通過調試器中的代碼來查看異常發生的位置? – OldProgrammer 2014-10-27 18:30:25

+0

你確定你有足夠的RAM來處理8 nPr 8的遞歸深度嗎?每次你調用'easyStrings'時,你都會使用越來越多的堆空間和你聲明的所有新字符串。 – RPGillespie 2014-10-27 18:47:07

回答

0

用gdb粗略瀏覽一下這個函數就會發現這個函數是遞歸的,而且超過一定長度的字符串會觸發它進入無限深度的遞歸(或者至少是一個4G內存無法處理的深度) 。我會看你的遞歸條件,並仔細檢查是否有一個退出的情況下,將滿足所有的人。

+0

它沒有進入無限循環,但我覺得沒有足夠的內存分配是唯一可能的原因。謝謝。 – user3453575 2014-10-27 19:01:55