2014-03-04 5 views
0

중복 된 내용을 인쇄하고 문장의 파일 끝까지 여분의 공백을 제거 할 때까지 읽는 코드를 없애기를 원합니다.파일에서 문장을 읽고 각각을 두 단어로 나눕니다.

이 코드를 사용하여 각 문장을 단어로 나눕니다.

vector <string> oneWordPhrase; 
vector <string> twoWordPhrase; 

vector<string>::iterator it1; 
vector<string>::iterator it2; 

    string split = str; 
    string word; 
    stringstream stream(split); 
    while(getline(stream, word, ' ')) 
    { 
    cout<<word<<endl; 
    oneWordPhrase.push_back(word); 
    }//split the sentence into words 

    for(it1=oneWordPhrase.begin(); it1!=oneWordPhrase.end(); it1++) /* the problem 
    {             is here. */ 
    if(it1+1 == oneWordPhrase.end()) 
     break; //signal break if we are near the end of a sentence 
    twoWordPhrase.push_back(*it1 + ' ' + *(it1+1)); 
    } 

for(int i=0; i<twoWordPhrase.size(); i++) 
    cout<<twoWordPhrase[i]<<endl 

이 코드는 하나의 문장으로 작동합니다. 예를 들어, 내 문자열이 "여보세요, 내 이름은 밥입니다. 나는 학생입니다." 나는 인쇄 할

"안녕 내"

"내 이름"

/* 새로운 문장 */

"밥입니다" "이름이" "나는 있습니다"

"am a"

,210

"학생"

그러나 내 출력

이다 "안녕 내"

"내 이름은"

"밥입니다" "이름입니다"

/* 여기에 문제가 있습니다. 이 문장의 처음으로 돌아갑니다 *

/

"안녕 내"

"내 이름"

"밥 내가"밥입니다 ""이름이 " "

/* 새 문장도 인식하지 못함 */

" 나는 "

"A "

"학생 "

이 날이 처음이 아니라 중단 된 부분을 가리 키도록 내 반복자를 사용하기위한 방법이 생각입니다. 이 코드는 한 문장에서 잘 작동하지만 문자열이 두 개 이상인 중복을 만듭니다.

+0

'중단'대신 '계속'을 사용할 수 없습니까? –

답변

0

문장의 끝을 제대로 감지하지 못합니다.

if(it1+1 == oneWordPhrase.end()) 
    break; //signal break if we are near the end of a sentence 

위의 줄은 전체 구의 끝에 도달했을 때만 실행됩니다. 단지 문장이 아닙니다. 문장을 찾으려면 기간을 알아 내야합니다.

for (it1 = oneWordPhrase.begin(); it1 + 1 != oneWordPhrase.end(); it1++) { 
    if (it1[0][(it1[0].size() - 1)] == '.') { 
     continue; 
    } 
    twoWordPhrase.push_back(*it1 + ' ' + *(it1 + 1)); 
    } 

내가 당신 break 문의 동작을 시뮬레이션 할 수 it1 + 1 != oneWordPhrase.end()it1 != oneWordPhrase.end() 변경 : 여기에 하나의 가능한 방법입니다.

it1[0][(it1[0].size() - 1)] 

저장된 단어의 마지막 문자를 추출합니다.

관련 문제