2014-04-01 78 views
0

不知道爲什麼這個問題對我來說太難了。迭代地說,這是蛋糕,但一旦堆棧解開,它就會破壞我的整個功能。遞歸查找子串

它找到正確的指針,並且如果找到它,則給函數一個真值。但是,一旦調用堆棧解除,它就會一直恢復爲假。有誰知道如何解決這個問題或者我在做什麼我的代碼錯了?

這裏是我迄今爲止...

bool mySubStr(char * needle, char * haystack) 
{ 
    int needleLength = strlen(needle); 
    int haystackLength = strlen(haystack); 
    bool found = false; 

    if(needleLength < haystackLength) 
    { 
     if(strncmp(haystack, needle, needleLength) == 0) 
     { 
      found = true; 
     } 
     else 
     { 
      mySubStr(needle, haystack + 1); 
     } 
    } 

    return found; 
} 
+0

如果您可以具體說明您的預期結果,實際得到的結果以及迄今爲止您瞭解或解決問題所採取的步驟,這將會很有幫助。 – Edward

+0

當我的針=「sip」和haystack =「密西西比」時,我預期的結果是正確的。我實際得到的結果是錯誤的。我採取的解決問題的步驟很多。我甚至不知道從哪裏開始。 – MrPickle5

+0

只需在你的else塊中添加一些代碼:found = mySubStr(needle,haystack + 1); – acegs

回答

5

您需要遞歸調用的結果返回給mySubStr(..)

bool mySubStr(char * needle, char * haystack) 
{ 
    int needleLength = strlen(needle); 
    int haystackLength = strlen(haystack); 

    if(needleLength > haystackLength) 
     return false; 

    if(strncmp(haystack, needle, needleLength) == 0) 
    { 
     return true; 
    } 

    return mySubStr(needle, haystack + 1);   
} 

在您的實現,你調用該函數遞歸但丟棄結果:

else 
    { 
    mySubStr(needle, haystack + 1); 
    } 
} 

return found; 

所以實際上,除非恰巧在開頭,你的函數總會返回false。

+0

或者他可以這樣做:found = mySubStr(needle,haystack + 1); – acegs

+0

@Miky Dinescu - 哇,非常感謝你! xuwicha,我試過了,它一直給我提出同樣的問題。當堆棧調用解開時恢復爲false。 – MrPickle5

+0

@ MrPickle5:同時在你的第一條件if中添加「=」if(needleLength <= haystackLength){} – acegs