2014-12-18 3 views
1

다음은 특정 단어 (문자열)의 모든 인스턴스를 부모 문자열의 다른 단어 (strng)로 대체하는 함수입니다.while 루프를 do while 루프로 변환

void clean(std::string &s,const std::string oldVal,const std::string newVal){ 
    std::string::size_type pos = 0; 

    while((pos = s.find(oldVal,pos)) != std::string::npos){ 
     s.replace(pos,oldVal.size(),newVal); 
     pos += newVal.size(); 
    } 
} 

저는 C++을 처음 접했고 약간의 이해가 어려웠습니다. 그래서이 코드를 더 읽기 쉽게 만들 생각입니다. 나는 do while 루프로 만들려고했다. 그러나 프로그램이 중단되었습니다. out_of_range 예외를 Throw합니다.
내 코드에 어떤 문제가 있습니까? 같은 문자열을 사용하여 두 기능을 모두 확인했습니다.

void clean2(std::string &s,const std::string oldVal,const std::string newVal){ 
    std::string::size_type pos = 0; 
    do{ 
     pos = s.find(oldVal,pos); 
     s.replace(pos,oldVal.size(),newVal); 
     pos += newVal.size(); 
    }while(pos != std::string::npos); 
} 
+4

'do-while' 루프에서, 사용하기 전에'pos'를 체크 할 필요가 있습니다. –

+0

나는 while 조건에서 확인하고 있습니다. –

+2

'replace' 함수에'pos'를 사용하고 추가하기 전에 말입니다. –

답변

2

당신이

pos = s.find(oldVal,pos); 

그렇지 않으면 당신은 POS의 유효하지 않은 값을 사용할 수 있습니다 문 다음에 확인해야이 조건

pos != std::string::npos 

. 루프. :)

대신 당신이 루프를 사용하여 함수를 다시 작성할 수있는 루프 DO-동안의 while 루프를 대체하면서

그래서이 경우 while 루프가 좋아 보이는 것은 다음 않습니다. 예를 들어,

+0

오, 확인. 지금은 이해. oldval의 마지막 발생 이후 조건은 여전히 ​​true를 반환하고 do가 실행됩니다. 그리고 그것은 사물을 엉망으로 만듭니다. –

1

while 루프와 do-while 루프가 존재하며 가독성을 위해서만 사용되는 이유가 있습니다.
가장 큰 차이점은 조건을 확인하는 시간입니다.
이전 버전은 find -> test -> replace 순서로 작동합니다.
버전은 find -> replace -> test 순서로 작동합니다.

바꾸기를 시도하기 전에 동일한 루프 조건을 검사하는 바꾸기 전에 if를 추가하는 것이 좋습니다. 그러나 그것은 원래 IMO보다 덜 효율적이고 판독하기가 쉽지 않습니다.

1

당신이 모두 필요합니다

문자열이 발견되지 않은 경우와 "하지 문자열이 발견되지 않는 경우 대체 전화" "POS에 newVal.size()를 추가하지". 같은에

while(true) 
{ 
    pos = s.find(oldVal,pos); 
    if (pos != std::string::npos) 
    { 
     s.replace(pos,oldVal.size(),newVal); 
     pos += newVal.size(); 
    } 
    else 
    { 
     break; 
    } 
} 

또는 다른 많은 변종 :이 같은 것을 할 수있는, 또는

void clean2(std::string &s,const std::string oldVal,const std::string newVal){ 
    std::string::size_type pos = 0; 
    do{ 
     pos = s.find(oldVal,pos); 
     if (pos != std::string::npos) 
     { 
      s.replace(pos,oldVal.size(),newVal); 
      pos += newVal.size(); 
     } 
    }while(pos != std::string::npos); 
} 

: 그래서 당신은 DO-동안 루프 즉

내부의 경우 다른 필요 테마.

+0

do 블록에서 pos를 확인해야하는 이유는 무엇입니까? do while like this (AFAIK) : do를 실행합니다. 조건을 확인하고 다시 실행하십시오. 따라서 pos가 처음 유효 할 것이라는 보장이 있다면 왜 확인해야합니까? do가 처음 실행 된 후에 while 조건을 점검하지 않습니까? –

+0

이제 알겠습니다. –

관련 문제