2014-11-10 2 views
0

작성하려고하는 재귀 함수에 문제가 있습니다. 이 함수의 목적은 문자열 내에서 문자열을 찾은 다음 두 번째 문자열이 첫 번째 재귀를 사용하는 색인 ​​안에있는 인덱스를 반환하는 것입니다.문자열 재귀 함수 오류 내의 문자열

나는 이것을 할 수있다. 두 번째 문자열이 첫 번째 문자열에 포함되지 않은 경우 문제가 발생합니다. 두 번째 문자열을 찾지 못했음을 사용자에게 알려야합니다. 그 메시지를 전달할 수는 없습니다.

int index_of(string s, string t){ 
    int len1 = s.length(), len2 = t.length(), index = 0; 
    if (len1==len2){ 
    if (s.substr(index, len2) == t){ 
     return index; 
    }else{ 
     return -1; 
    } 
    else{ 
    index++; 
    return index_of(s.substr(index, len1),t)+index; 
    } 
} 

int main(){ 
    string strOne = "", strTwo = ""; 
    cout << "This program will find the ocurrence of one string within  another.\n\nEnter the string to be searched:\t"; 
    getline(cin, strOne); 
    cout << "\nNow enter the string you want to search for:\t"; 
    getline(cin, strTwo); 
    int index = index_of(strOne, strTwo); 
    if (index == -1){ 
    cout << "\nThe second string cannot be found. Sorry!\n\n";} 
    else{ 
    cout << "\nThe index of the substring is:\t" << index << "\n\n"; 
    } 
    system("PAUSE"); 
    return 0; 
} 

모든 도움을 주시면 감사하겠습니다. :)

+0

그런 목적으로 재귀 함수를 사용하면 안됩니다. 큰 문자열에서는 스택 오버플로가 발생합니다. – Heavy

+0

저는 C++ 프로그래머가 아니지만 다음과 같이 문자열을 비교할 수 있습니까 : 'str1 == str2'? strcmp (str1, str2)를 사용할 필요가 없습니까? 첫 번째 옵션은 문자열의 주소 만 비교한다고 생각하십니까? – linluk

+0

가능한 복제본 [재귀 적으로 벡터를 비교하는 방법] (http://stackoverflow.com/questions/26353067/how-to-recursively-compare-vectors) – smac89

답변

0

첫 번째 문자열에 초를 포함하지 않으면 index이 무한대로 증가되어 string s 길이가 0입니다. 따라서 첫 번째 문자열이 두 번째 문자열보다 짧은 지 여부를 확인해야합니다. 그렇다면 부분 문자열을 포함하지 않습니다.

if (len1 < len2){ 
    // first string doesn't contain the second 
    return -2; 
    }else if (len1==len2){ 
    ... 

하지만 여기서 재귀 함수를 사용하면 안됩니다. 확인이 질문 : 또한 내장 된 기능 findstring에있다 Check if a string contains a string in C++가 컴파일되지 않습니다 당신이 게시 한 코드에 문제가 먼저 및 으뜸가의 숫자가있다

+0

이어야합니다'std :: find'는 단일 문자를 찾습니다. 하위 문자열을 검색하려면'std :: search'가 필요합니다. –

+0

정확하지는 않지만 몇 가지 과부하가 있습니다. http://www.cplusplus.com/reference/string/string/find/ – Heavy

+0

하지만 그건 당신이 말한 것이 아닙니다. "내장 함수"에 넣을 수있는 유일한 해석은 "멤버 함수"가 아니라 "표준 라이브러리 함수"입니다. –

0

당신 때문에 indexindex_of에 정의하지 마십시오. 물론 두 줄의 길이가 같으면 만 비교하면됩니다. 그러나 은 정의되지 않은 변수를 기반으로 하위 문자열을 사용하기 때문에 과 비교하려는 것이 무엇인지 파악하기가 어렵습니다. index; 모두 st이 동일한 길이를 가지고있는 경우에만 이 분기를 입력하기 때문에 (index0 인 경우는 문자열을 복용 아무 문제가 없다, 그리고 index 다음, 0없는 경우 s.substr(index, len2) == t 사실 일 수 없다.

당신이 정말로 함수가 무엇을해야 일반 영어로 정의하여 시작한다 무엇을해야

:

  • s 경우가 t보다 짧은, 아니 경기 전 가능하므로 반환 -1.

  • s의 시작이 t 일 경우 현재 색인을 반환합니다.

  • 그렇지 않으면 s의 부분 문자열에서 첫 문자를 제거하고 (index을 증가 시킴) 반복합니다.

물론 index도 어딘가에 유지해야합니다. 클래식 재귀에서는 추가 함수 인수로 사용됩니다.

솔직히 말해서, 나는 이 아니며,은 모든 부분 문자열을 구성합니다. 이터레이터를 사용하는 것은 C++에서 훨씬 더 많은 문자입니다.사용자가 여분의 인수에 을 통과하지 않았을 수 있도록 내가, 비 재귀 하나의 재귀 기능을 포장 할 다음을 거치지 않고,

int 
indexOf(std::string const& text, std::string const& target) 
{ 
    return indexOf(0, text.begin(), text.end(), target); 
} 

또는 : 사용자가 같은 것을 호출 할 수 있습니다 . 추가 인수는 : 그렇지 않으면, 물론, 단지 두 번째 버전에서 std::search 를 호출 한 일반적으로이 같은 문제에 대한 재귀 를 사용하지 않을, 그리고

int 
indexOf(std::string const& text, std::string const& target) 
{ 
    std::string::const_iterator results 
      = search(text.begin(), text.end(), target); 
    return results == text.end() 
     ? -1 
     : results - text.begin(); 
} 

는 (나는이 숙제입니다 있으리라 믿고있어 작업이 완료되었습니다. 또는 text.find(target) , 거의 정확히 원하는 것을 반환합니다.)