2012-06-12 5 views
0

내 프로그램의 마지막 부분에 도움이 필요합니다. 더 큰 문자열 내에서 문자열을 찾고, 발견 된 경우 부분 문자열의 시작 위치를 반환해야합니다. 방향에서 :큰 문자열에서 문자열 검색

문자열 위치는 0에서 시작하여 길이가 -1입니다. 문자열이 발견되지 않으면 -1 값이 리턴됩니다.

시작한 후 다음 코드가 컴파일됩니다.이 코드가 실제로 올바른지 알고 싶습니다. 내 머리 위로 들어가고 싶지는 않지만 전문가로부터 의견이 필요합니다. 이 일을 제대로하고 있습니까? 아니면 적어도 올바른 방향으로 가고 있습니까? 당신은 매우 정교한 아무것도 할 haystack의 일부 인덱스가와 경우에만 경우 needlehaystack의 문자열임을 고려하지 않는 가정

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

사람들이 코드를 검토 할 장소가 아닙니다. Code Review SE 사이트를 사용해 볼 수도 있습니다. – templatetypedef

+0

Q와 직접적인 관련이 없음 : 메모리 누수가 있습니다 : new [] (할당 할 필요는 없지만) [delete]를 절대로 사용하지 마십시오. – jrok

+0

@jrok 감사합니다! 내가 지적한 누수 때문에 코드를 편집했습니다. – user1363061

답변

1

가있는 해당 인덱스에서 시작하는 문자열은 needle 같다 .

또한 부분 문자열을 많이 복사 할 필요가 없습니다. 선택한 색인에서 시작하여 (a) 불일치를 찾거나 다른 색인을 시도하거나 (b) haystack가 부족할 때까지 문자 하나를 비교하면됩니다. 일치하지 않는 경우 또는 더 큰 색인 또는 다른 경우 (c) needle이 부족한 경우 일치하는 항목을 찾았으므로 작업중인 색인을 반환하십시오.

두 개 이상의 일치 항목이있는 경우 (예 : "na""banana"으로 검색) 방향에 따라 반환 할 경로가 표시됩니다. 이것은 인덱스를 고려해야 할 순서를 haystack에 알려줍니다.

매우 정교한 작업을 수행하려는 경우 Boyer-Moore, Knuth-Morris-Pratt 및 다양한 트레이드 오프가있는 기타 게시 된 문자열 검색 알고리즘을 찾아보십시오. 좋은 사람을 발명하는 데는 한 명 이상의 사람이 필요합니다.

+0

감사합니다. 이것은 많은 도움이되었습니다. 이제는 하나의 질문 만 있습니다. 루프를 사용하지 않는 경우 가장 효율적인 방법은 무엇입니까? 글쎄, 2 가지 질문 : 모든 문자를 비교 한 후에 시작 위치를 놓고 되돌릴 방법이 없어 보이는 시작 위치를 반환하는 것으로부터 항상 벗어납니다. – user1363061

+0

가장 효율적인 방법은 전혀하지 않는 것입니다. 귀하의 편의를 위해 디버깅 및 최적화 된 라이브러리를 사용하십시오. –

+0

@ user1363061 : 시작 위치를 가져 오는 데는 여러 가지 방법이 있습니다. 하나는 변수를 비교하는 동안 변수에 저장하는 것입니다. 또 다른 방법은 '건초 더미'의 어떤 오프셋에서 바늘의 길이를 빼는 것입니다. 가장 효율적인 방법의 문제는 간단한 대답을 인정하기에는 너무 복잡합니다.각 알고리즘에는 특정 입력 (또는 입력 범주)이 있으며 더 좋거나 나 빠릅니다. –

0

내 관점에서 보면 다소 잘못된 코드입니다. 문자열의 끝을 나타내는 데 char * -strings에 \ 0이 사용됩니다. 문자열을 캡슐화하지 않는 클래스에서는 사용할 필요가 없습니다. 문자열에 하위 문자열을 찾는 많은 알고리즘이 있으며 그 중 하나가 Knuth-Morris-Pratt 알고리즘입니다. 기타이 기사에 나열되어 있습니다 String searching algorithm

+0

"문자열을 캡슐화하지 않는 클래스에서는 사용할 필요가 없습니다."- 그러나 std :: string은 않습니다. 틀림없이, 그것은 단지'c_str()'함수를 지원하는 것입니다. –

+0

나는 그것을 명시 적으로 사용할 필요가 없다는 것을 의미한다. 코드를 읽기 쉽게 만듭니다. 'if (str.empty())'가'if (str [0] == '\ 0')'보다 훨씬 읽기 쉽고 ANSI 문자열을 유니 코드 문자열로 바꾸는 것이 더 쉽습니다. – Spo1ler

관련 문제