2017-01-24 8 views
0

내 소스 코드를 쓸 때 계속 실패합니다. target_word이 공백없이 두 번 쓰여지는 경우를 제외하면 거의 모든 테스트 케이스에서 작동하는 것 같습니다. 즉 target_word이 "입력"이고 changed_word이 "출력"이면 프로그램은 "inputinput"을 "outputoutput"으로 변경 한 다음 "input"의 다른 샘플을 "output"으로 변경하지 마십시오. 이 문제를 어떻게 해결할 수 있습니까?프로그램은 대상 단어가 두 번

답변

0
while(iss>>word) 

는 공백으로 구분 된 말을하고 word에 저장됩니다. 입력이 "입력 입력"이면, 스트림은 word에 "입력"을 쓰고 그 공간에서 멈 춥니 다. 다음 반복에서 다음 "입력"을 읽습니다. 그러나 입력이 "inputinput"인 경우 첫 번째 "입력"을 구분하는 공백이 없으므로 "inputinput"은 word으로 읽습니다. 이것은 "입력"과 일치하지 않으므로 한 가지 경우에는 너무 길기 때문에 교체가 발생하지 않습니다.

편집 : 나는 혼란의 일부를 보았다고 생각합니다. "물고기 물고기"가 대체 할 단어이고 "새"가 대체 물고기 인 "해마 물고기 물고기 탱크"의 생산량을 살펴 봅시다.

Iteration 1: walrus != fish. No replacement. Line = "walrus fishfish fish tank" 
Iteration 2: fishfish != fish. No replacement. Line = "walrus fishfish fish tank" 
Iteration 3: fish == fish. Replace first fish. Line = "walrus birdfish fish tank" 
Iteration 4: tank != fish. No replacement.  Line = "walrus birdfish fish tank" 

는 유일하게 인정 물고기 이었기 때문에 최초의 "물고기"를 대체 감아 세 번째 "물고기". 이렇게하면 stringstream>>

끝 부분 대신 사용할 부분에 대한 힌트를 얻을 수 있습니다.

대신 줄을 구문 분석 할 stringstream>>를 사용하여, 당신은 find

auto pos = line.find(target_word); 
while (pos != string::npos) 
{ 
    line.replace(pos, target_word.length(), changed_word); 
    pos = line.find(target_word); 
} 

또는 간단하지만 덜 분명한에 고집 오프 아마도 더 나은 :

이 될 것
while ((auto pos = line.find(target_word)) != string::npos) 
{ 
    line.replace(pos, target_word.length(), changed_word); 
} 

주 회선에 target_word이있는 경우 무한 루프가 발생하고 은 항상으로 바꾸고 바꾸기 때문에 target_word == changed_word이됩니다.. 이 경우는 초기에 확인할 수 있으며 프로그램은 사용자 입력을 다시 인쇄하는 다른 경로를 입력 할 수 있습니다. 사용자는 차이점을 알 수 없습니다.