2017-02-28 46 views
-2

我試圖創建一個完全顛倒的字符串不使用reverse()函數或循環功能(即「你好」變成「2009東海生日賀」),但我得到一個分段故障,我編寫了下列代碼:倒車使用遞歸的字符串不<algorithm>或環

void reverseString(string &s) { 
    int strIndex = 0; 
    int strSize = (s.size() - 1); 

    if (s.size() <= 1) { 
     return; 
    } 

    else { 
     if (strIndex < (s.size()/2)) { 
      int temp = s.at(strIndex); 
      s.at(strIndex) = s.at(strSize); 
      s.at(strSize) = temp; 

      strIndex = strIndex + 1; 
      strSize = strSize - 1; 

      reverseString(s); 
     } 
    } 
} 

注意:我不允許更改函數的參數。

+2

使用調試器。設置一個斷點,然後遍歷代碼,並觀察變量。 – abelenky

+0

'strIndex'是'0'when你輸入的功能,所以'else'分支總是做同樣的事情,所以你停留在一個無限循環,從而導致堆棧溢出。進一步研究局部變量如何工作。 – molbdnilo

+0

你需要傳遞strindex和了strsize到reverseString – pm100

回答

0

這條線:

strIndex = strIndex + 1; 

不能產生效果,因爲局部變量不被「重用」用於下一次調用該函數。每個函數調用都會創建一組新的局部變量。

既然你不能改變函數簽名,你就必須要改變字符串。也許是這樣的:

void reverseString(string &s) { 
    if(s.size() <= 1) 
     return; 
    char c = s[0]; 
    s = s.substr(1, s.size() - 1); 
    reverseString(s); 
    s += c; 
} 
+0

啊。從來沒有想過使用substr函數來改變我的字符串。我知道如果我再次調用reverseString(),我會遇到局部變量的問題,但我不確定如何解決它。非常感謝。 – Tenquen

0

你只是調用相同的字符串,這隻會導致同樣的過程重複循環往復,導致計算器遞歸reverseString