2016-08-08 2 views
0

C++에서 문자열을 토큰 화하려고했습니다.특정 조건이 충족되는지 여부에 따라 for 루프의 문자열 출력이 변경됩니다.

for(unsigned int i=0; i < data_str.length(); i++) 
{ 
    tok += data_str[i]; 
    if(tok[i] == '\n') 
    { 
     //cout << "NEWLINE" << endl; 
     tok = ""; 
    } 
    if(tok == "output:") 
    { 
     cout << "OUTPUT FOUND" << endl; 
     tokens.push_back("output:"); 
     tok = ""; 
    } 
    cout << tok << endl; 
} 

당신이 특정 토큰 ("출력") 때 나는 tok 변수를 재설정하고 있습니다 볼 수 있듯이 :는 아래와 같이 나는, 내가 문자열을 반복 사용 해요 for 루프가 녹이다. 그런 다음 tokens이라는 내 토큰을 저장하는 데 사용하는 벡터에 문자열을 추가합니다. 내 토큰 벡터에 적절한 양의 문자열이 있는지 확인하려면 인쇄했습니다. 나는 두 개의 문자열, 각각 "출력 :"을 기대했다. 그러나 벡터를 인쇄 할 때 문자열은 하나뿐입니다. 나는 약간의 디버깅을 수행했으며, "output :"토큰을 찾은 후에 tok 변수를 재설정하려고 시도 할 때마다 루프는 "출력 :"문자열 하나만 찾습니다. 나는 다음 tok 변수를 인쇄하기로 결정, 다음과 같은 출력을 가지고 :

내 루프가 제대로 만 작동
o 
ou 
out 
outp 
outpu 
output 
OUTPUT FOUND 
output: 
output:" 
output:"H 
output:"He 
output:"Hel 
output:"Hell 
output:"Hello 
output:"Hello 
output:"Hello W 
output:"Hello Wo 
output:"Hello Wor 
output:"Hello Worl 
output:"Hello World 
output:"Hello World" 

o 
ou 
out 
outp 
outpu 
output 
OUTPUT FOUND 
output: 
output:" 
output:"G 
output:"Go 
output:"Goo 
output:"Good 
output:"Goody 
output:"Goodye 
output:"Goodye 
output:"Goodye W 
output:"Goodye Wo 
output:"Goodye Wor 
output:"Goodye Worl 
output:"Goodye World 
output:"Goodye World" 
output:string 
output:string 

TWhy는 않는다 : 나는 내가 가진 tok 변수를 재설정 라인에서 주석 때

o 
ou 
out 
outp 
outpu 
output 
OUTPUT FOUND 

" 
"H 
"He 
"Hel 
"Hell 
"Hello 
"Hello 
"Hello W 
"Hello Wo 
"Hello Wor 
"Hello Worl 
"Hello World 
"Hello World" 
"Hello World" 

"Hello World" 
o 
"Hello World" 
ou 
"Hello World" 
out 
"Hello World" 
outp 
"Hello World" 
outpu 
"Hello World" 
output 
"Hello World" 
output: 
"Hello World" 
output:" 
"Hello World" 
output:"G 
"Hello World" 
output:"Go 
"Hello World" 
output:"Goo 
"Hello World" 
output:"Good 
"Hello World" 
output:"Goody 
"Hello World" 
output:"Goodye 
"Hello World" 
output:"Goodye 
"Hello World" 
output:"Goodye W 
"Hello World" 
output:"Goodye Wo 
"Hello World" 
output:"Goodye Wor 
"Hello World" 
output:"Goodye Worl 
"Hello World" 
output:"Goodye World 
"Hello World" 
output:"Goodye World" 
output:string 

을 변수를 재설정하려고하지 않을 때 tok? 변수를 재설정해야합니다. 그렇지 않으면 프로그램의 다른 부분이 작동하지 않습니다. 내 tok 변수를 재설정 할 수있는 대체 솔루션이 있습니까? 그래서

답변

2

tokstd::string 인 것은 분명하다 :

for(unsigned int i=0; i < data_str.length(); i++) 
    { 
     tok += data_str[i]; 
     if(tok[i] == '\n') 
     { 
      //cout << "NEWLINE" << endl; 
      tok = ""; 
     } 

하자 사용하는 종이와 연필, 구문 분석 알고리즘의 바로이 부분을 따라 해. data_str 다음 텍스트로 구성되어 있다고 가정 : tok 지금 "hello\n" 포함하도록 tok[5]'\n' 때문에 data_str[5]가, tok에 추가됩니다

"hello\nworld" 

후, 톡은 빈 문자열로 삭제됩니다.

다음 반복에서 data_str[6]은 빈 tok에 추가되므로 tok에 이제는 "w"가 포함됩니다 (루프의 이전 반복에서 지워졌 기 때문에).

if(tok[i] == '\n') 

i 이제 6 인이 tok[6]를 체크한다. 물론 tok에는 문자가 하나만 있습니다. 이로 인해 정의되지 않은 동작과 의미없는 결과가 발생합니다.

이 시점에서 앞으로의 일들이 꽤 많이 벗어납니다.

여기 의도, 모든 줄 바꿈 후 tok 버퍼를 취소 i 있기 때문에, 대신 tok[i]의, tok[tok.size()-1]을 것 tok의 마지막 문자를 확인하고 tok의 크기가 서로 할 절대적으로 아무것도하는 경우, 도대체 무엇이.

+0

또는'data_str [i]'를 사용하십시오. – immibis

관련 문제