2013-11-25 150 views
0

首先我想說的是,這是一項家庭作業,儘管我並不是要求你爲我做這件事,而是要求我們爲什麼會崩潰。編寫函數subCount()時出現遞歸問題,該函數需要兩個字符串參數"str""sub",並檢查"sub""str"中出現的次數,返回一個int。你必須使用遞歸。 這裏是我的代碼<string>std命名空間。用字符串遞歸:: find()

int subCount(const string& str, const string& sub) 
{ 
    if (str.find(sub != string::npos)) 
    { 
     return 1 + subCount(str.substr(1, str.length()), sub); 
    } 
    else 
    { 
     return subCount(str.substr(1, str.length()), sub); 
    } 
} 

它建立良好(使用Visual Studio 2012),但試圖運行時崩潰。我懷疑我沒有正確使用find()函數,但我無法理解cplusplus.com上的參考資料,它對於字符串參數爲"size_t find (const string& str, size_t pos = 0) const noexcept;"。目前,我對find()的理解是,如果"sub"str,那麼它返回true,導致return 1 + subCount(str.substr(1), sub);執行,如果不是,那麼返回其他語句。如果find()函數沒有問題,請說出來,問題是什麼,而不是如何解決它。感謝您抽出時間來閱讀。

回答

0

你的功能因爲Stackoverflow而崩潰(最常見的原因是遞歸函數崩潰)substr對空字符串。

函數的所有分支都遞歸地調用它自己,並且永遠不會停止。

您需要檢查是str是一個空字符串,如果是則返回0。由於這是一項功課,所以我不會爲您發佈工作代碼。

+0

非常感謝,程序現在正在運行。 – Mozzarella

0

您需要檢查find函數的使用。我無法編譯你的功能。

要求是使用遞歸搜索模式出現在字符串中的次數。

解決方案:

  1. 你應該用發現FUNC但記得找FUNC返回它找到的圖案的位置,所以以後每一個成功的find()方法,你將不得不跳過部分搜查,在剩下的搜索串。
  2. 使用find的正確語法。

str.find(子!=字符串::非營利組織) //這是錯誤的。

+0

謝謝回答,但是我大約在20分鐘前就想出了它。當我找到find()函數時,我一直很興奮,所以我試圖使用它,卻沒有意識到它檢查'sub'是否在'str'中,而不是'str'的​​開頭,我希望它在是。至於語法,我將該部分編輯到了錯誤的地方,但在我的代碼'str.find(sub)!= string :: npos'中是正確的。無論如何感謝你看這個。 – Mozzarella