2013-04-01 4 views
0

아래 코드는 간단합니다. 내가 아는 한 string :: find()가 일치하는 것을 찾지 못하면 -1을 반환한다. 그러나 몇 가지 이유로 아래 코드는 작동하지 않습니다. 매번이 코드를 실행하면 무한 루프가 발생합니다. 도와 줘서 고마워!string.find()가 -1을 반환하지 않습니다.

#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    string text; 
    text = "asdasd ijk asdasd"; 
    string toReplace = "ijk"; 
    cout<<text<<endl; 
    int counter = 0; 
    while (text.find(toReplace) != -1) 
     counter++; 

    cout<<counter<<endl; 

    system("pause"); 
} 
+1

[std :: basic_string :: find()] (http://en.cppreference.com/w/cpp/string/basic_string/find)의 설명서를 읽는 데 시간이 많이 걸렸습니다. * in wonder * in 어떻게 작동하는지 배우기. – WhozCraig

+0

업데이트 : while (text.find (toReplace)! = string :: npos) 동안 사용하려고했지만 끝이없는 루프가 계속 발생합니다. ( – eoLithic

+0

의미없는 카운터를 증가시키는 것 외에는 아무 것도하지 않으셨습니까? 첫 번째 확인, 시간만으로는 별다른 호응을 얻지 못할 수도 있습니다. 성공한 히트를보고 시작할 위치를 변경하십시오. – WhozCraig

답변

10

참조하십시오. 예를 들어 : 그것은 text에서 toReplace 문자열을 찾기 위해 계속 노력하고 항상 그것을 찾을 수 있기 때문에

while(text.find(toReplace) != std::string::npos) 
    counter++; 

는 (캐릭터마다의 처음부터 시작을 찾을 수 있기 때문이다) 무한 루프가 될 것입니다. 이것은 아마도 당신이 의도 한 것이 아닙니다.

+0

감사합니다! 그래서 매번 무한 루프가됩니다! – eoLithic

+0

@ user2167403 건배! 다행히 도와 드리겠습니다. –

+0

@ user2167403 하하,이 새로운 패러다임 또는 디자인 패턴이 있습니까? – 4pie0

8

std::string::find 반환 std::string::npos 검색된 문자열이 발견되지 않는 경우,하지 -1. npos의 정확한 값은 같이 구현 정의, 그래서 npos를 사용

while (text.find(toReplace) != std::string::npos) 

이 그것을 생각해 보면 , find는 반환하지 수 -1 싶어도 발견의 반환 유형으로 지정되어 있기 때문에에 std::size_t이고 부호가없는 유형입니다.

또한 찾을 수 에 상관없이 당신이 전화를 몇 번이나 문자열의 발생에 대한 항상 검색. 모든 사건을 반복하려는 경우 find의 오버로드를 사용해야하며 두 번째 매개 변수 - 검색을 시작할 위치입니다.

+1

'npos' *은''-1' ('size_type'으로 변환)입니다. '-1 '틀림없이 덜 유행이지만 정확하지는 않습니다. –

+0

"* is * -1"이고 "-1은 size_t로 변환됩니다"는 다른 것입니다 :) –

+1

사실, 확실히 구현 정의가 아니며'size_type' 결과 'find '와'-1'은'npos'와 비교했을 때 항상 같은 결과를 줄 것입니다. –

5

누구든지이 점이나 읽은 곳마다 당신에게 거짓말했습니다.

std::string::find이 실패하면 std::string::npos을 반환하며 -1이 아닙니다.

확실하지 않을 때는 그러한 것에 관한 설명서를 확인해야합니다.

UPDATE : 귀하의 코멘트에 대해서는

while (std::string::npos != text.find(toReplace)) 

:

그래서, 당신의 while 같은 것을 할 것이다! 나는 (text.find (toReplace) 동안 = 문자열을 사용하려 :: npos) 그러나 나는 여전히 끝없는 루프를 얻는다. (- user2167403 10 초전에

실제로 documentation을 읽는 법을 배워야합니다. 변수를 사용하여 std::string::find의 최종 결과를 저장하고 std::string::find의 두 번째 매개 변수 - pos (값 - last_match_position + 1 전달)을 사용하십시오.

두 번째 매개 변수를 생략하면 std::string::find은 항상 문자열 시작 부분부터 시작하여 무한 루프가 발생합니다.

0

text 변수를 제공 한 코드에서 toReplace 변수에 저장된 하위 문자열 "ijk"을 포함합니다. while 순환 중에는 text 또는 toReplace 변수가 변경되지 않습니다. find 메소드는주기가 계속 진행되는 동안의 조건 인 -1 값을 항상 반환하지 않습니다.

다른 의견에서 이미 언급했듯이 -1을 확인하지 말고 std::string::npos을 확인해야합니다.

0

매뉴얼 페이지 (string :: npos가 답입니다)를 읽는 것이 도움이됩니다.

난 그냥 당신의 while 루프 어쨌든 무한 루프를 생산 것을 추가하고 싶었 완전히 정확 다른 답변에서 제외 http://www.cplusplus.com/reference/string/string/find/

관련 문제