2012-02-24 14 views
0

이 함수는 문자열을 자르고 공백없이 모든 소문자를 반환하려고합니다. 그리고 이렇게하려면 문자열이 "The Time Traveller (for so it will be convenient to speak of him)"에 공백이 있는지 확인하기 위해 " "을 찾으려고합니다.C++ std :: string :: find는 항상 npos를 반환합니까?

코드는 다음과 같습니다. 위의 문자열을이 함수에 전달합니다. 항상 string::npos을 반환합니다. 문제에 대한 어떤 생각?

string chopstring(string tocut){ 
    string totoken = ""; 
    int start = 0; 
    while(tocut[0] == ' ' || tocut[0] == 10 || tocut[0 == 13]){ 
     tocut.erase(0); 
    } 
    int finish = 0; 
    finish = tocut.find(" ", start); 
    if (finish == string::npos){ 
     cout << "NPOS!" << endl; 
    } 
    for (int i = start; i < finish; i++){ 
     totoken += tocut[i]; 
    } 
    tocut.erase(start, finish); 
    return tokenize(totoken); 
} 

답변

3

tocut.erase(0)tocut의 모든을 삭제합니다. 인수는 첫 번째 문자이며 지우는 길이는 "everything"입니다.

tocut[0 == 13]은 아마도 tocut[0] == 13이어야합니다. 그것들은 아주 다른 진술입니다. 또한 정수 대신 문자 값 ('\t')과 비교하십시오. 덧붙여 말하자면 이전과 함께 실제 문제는 tocut[0 == 13]tocut[false]이되며 tocut[0]true이됩니다. 따라서 루프는 tocut이 비어있을 때까지 계속 실행됩니다 (즉, 첫 번째 시도에서 모두 지나치게 지울 수 있기 때문에).

위의 두 버그의 최종 효과는 find 문에 도달하면 tocut이 공백 문자를 포함하지 않는 빈 문자열입니다. 계속 ...

루프 대신 substr 함수를 사용하여 tocut에서 totoken으로 마이그레이션 할 수 있습니다.

행은 아무런 도움이되지 않습니다. tocut은 가치가 지나치다가 즉시 반환합니다.

+0

하지만 http://www.cplusplus.com/reference/string/string/erase/ 에 있습니다. iterator erase (iterator position); 반복기 위치에서 참조하는 문자를 지 웁니다. 한 문자 만 영향을받습니다. – samuraiseoul

+1

또한,'tocut [0] == 10 || tocut [0 == 13]'매우 이상하게 보입니다. 대 문자 리터럴을 비교하려면 실제 리터럴 (즉,''\ n' '대신에 10)을 사용하십시오. 훨씬 더 읽기 쉽습니다. 'tocut [0 == 13]'은 아마도 오자 일 것이고'0 == 13'은 항상 거짓이므로 첫 문자의 값을 반환 할 것입니다 (문자열이 비어 있지 않으면 0이 아닌 값이됩니다) . 다시 문자 리터럴을 사용하십시오. (' '\ r'') –

+1

@Samuraisoulification :'int'는'string :: iterator'와 같은 타입이 아닙니다. –

1

사실, 대부분의 코드가 기록 될 수 있습니다 훨씬 간단 (모든 공백을 제거하려는 나의 이해를 가정하는 것은 정확) : 당신은 실제로 모든 공백을 제거하려면

string chopstring(string tocut) { 
    std::string::size_type first(tocut.find_first_of(" \n\r")); 
    if (first != tocut.npos) { 
     tocut.substr(first); 
    } 
    tocut.erase(std::remove(tocut.begin(), tocut.end(), ' '), tocut.end()); 
    return tokenize(tocut); 
} 

, 당신은 아마 원하는 적합한 술어와 함께 std::remove_if()을 사용하십시오.

관련 문제