2012-06-12 44 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