2012-06-12 45 views
0

我真的需要我的程序最後部分的幫助。我需要在更大的字符串中找到一個字符串,如果找到了,則返回子字符串的起始位置。從方向:在較大的字符串中搜索字符串

請注意,您的字符串位置從0開始,以長度-1結尾。如果找不到字符串,則返回值-1。

我已經開始,下面的代碼編譯,我只是想知道這是否是正確的。我不想太過頭腦,但我需要一些專家的反饋意見。我做對了嗎?或者至少我正朝着正確的方向前進?

const int MyString::Find(const MyString& other) 
{ 
    int start(0); 
    int counter(0); 
    int end = other.Size; 
    int count(0); 
    int end1 = Size; 
    int nfound = -1; 
    char* temp; 

    if(other.String[0] != '\0' && other.String[0] != ' ') 
    { 
     if(other.String[count] == String[counter]) 
     { 
      start = counter; 

      for(int i = count; i < end-1;i++) 
      { 
       for(int j = counter; j < end1 -1; j++) 
       { 
        temp[j] = String[j]; 
       } 
      } 
      if(other == temp) 
      { 
       return start; 
      } 
      else 
       return nfound; 
     } 

     else{ 
      while(other.String[count] != String[counter]) 
      { 
       counter++; 
       if(other.String[count] == String[counter]) 
       { 
        start = counter; 
        for(int i = count; i < end-1;i++) 
        { 
         for(int j = counter; j < end1 -1; j++) 
         { 
          temp[j] = String[j]; 
         } 
        } 
        if(other == temp) 
        { 
         return start; 
        } 
        else 
         return nfound; 
       } 
      } 
     } 
    } 
    else 
    { 
     return nfound; 
    } 
} 
+0

SO不適合人們查看您的代碼的地方;您可能想要試用Code Review SE站點。 – templatetypedef

+0

與Q沒有直接關係:你有內存泄漏:你用'new []'分配(你甚至不需要),但你從不刪除[]'。 – jrok

+0

@jrok謝謝!考慮到您指出的泄漏,我編輯了代碼。 – user1363061

回答

1

假設你不想做任何事情非常複雜,考慮needlehaystack子串,當且僅當存在的一些haystack指數這起該索引的子等於needle

此外,您不需要複製大量的子字符串。從您選擇的索引開始,直接比較字符,直到(a)發現不匹配,在這種情況下嘗試另一個索引,或者(b)您用完haystack,在這種情況下,無法匹配任何更大的索引,否則(c)你用完needle,在這種情況下,你找到了一個匹配,所以返回你正在工作的索引。

如果有多個匹配項(例如在"banana"中搜索"na"),那麼希望這些指示可以告訴您哪一個返回。這告訴你在haystack中考慮索引的順序。

如果您確實想要做一些非常複雜的事情,請查閱Boyer-Moore,Knuth-Morris-Pratt以及其他一些發佈的字符串搜索算法,並進行不同的權衡。似乎需要一個以上的人來創造一個好的。

+0

謝謝!這有很大的幫助,現在我只有一個問題:如果不使用循環,最有效的方法是什麼?那麼,有兩個問題:我總是在返回起始位置之後旅行,因爲在比較所有字符後似乎沒有辦法縮回並獲得起始位置 – user1363061

+0

最有效的方法是不要這樣做 - 而不是你自己。使用經過調試和優化的庫,以方便您使用。 –

+0

@ user1363061:有多種方式可以獲取起始位置。一個是在比較字符時將其存儲在變量中。另一種方法是減去'haystack'中任何偏移量的'needle'長度。最有效的問題太複雜了,不能容許一個簡單的答案。每種算法都有一定的輸入(或輸入類別),它可以做得更好或更差。 –

0

從我的角度來看,這是一個不好的代碼。 \ 0用於char * - 字符串以指示字符串的結尾。在包裝字符串的課堂中不需要使用它。 有很多算法可以找到字符串中的子字符串,其中之一是Knuth-Morris-Pratt算法。其他在本文中列出String searching algorithm

+0

「在包裝字符串的類中不需要使用它」 - 然而,「std :: string」卻可以。無可否認,這實際上只是爲了支持'c_str()'函數。 –

+0

我的意思是,不需要明確地使用它。它使代碼不易讀。有些人喜歡'if(str.empty())'比'if(str [0] ==''0')更具可讀性,例如用Unicode字符串替換ANSI字符串會更容易 – Spo1ler