2016-10-28 11 views
0

좋아요. 하나의 문자열에서 새로운 문자열로 문자를 추가하는 while 루프가 있습니다. 일단 문자가 ' ' 일 때 끝나야하지만, 대신 끝없이 계속됩니다. 여기에 프로그램의 조각루프가 종료되지 않습니다.

istringstream istr(str); 
char token; 
istr >> token; 
string t; 
t.push_back(token); 
istr >> token; 
while (token != ' ' && token != '+' && token != '-') { 
    t.push_back(token); 
    istr >> token; 
} 
+1

추가를' istr &&'while 조건으로 입력 실패를 감지하도록 –

+0

cpp에서 문자열을 반복하려면이 [question] (http://stackoverflow.com/questions/9438209/for-every-character- 인 문자열) – Stargateur

+0

'istr' 파일의 끝에 도달하면 실패합니다. 그 다음의'>>'는 아무 작업도하지 않고 아무것도 쓰지 않습니다. 그래서,'token'은 변경되지 않고'ẁhile' 조건은 모든 루프에서 같은 결과를 낳을 것입니다. 그것이 끝없이 계속되는 이유입니다. –

답변

3

루프는 무한 작동의 경우 ' ', '+' 또는 '-'str 시작됩니다. 첫 번째 토큰을 건너 뜁니다. 이를 방지하기 위해 당신은 루프 전에 토큰을 읽을 수 없습니다해야

... 
istr>> token; 
string t;   
// t.push_back(token); // what if it's ' ' or '+' 
// istr>>token; // do not read second time 
while(... 

두 번째 경우는 빈 str입니다. 이 경우 비어 있는지 확인하고 처리하지 않아야합니다.

또한 str' ', '+' 또는 '-'는, 루프가 멈추지 않을 것입니다 포함하지 않는 경우. istr 끝 부분에서 중지하려면 istr을 추가하십시오. 끝까지 도달하면 istrfalse이되고 루프가 중지됩니다.


또한 istringstream없이 작업을 수행 할 수 있습니다

string str = ...; 
string t; 
for(char token: str) { 
    if(token == ' ' || token == '+' || token == '-') 
     break; 
    t.push_back(token); 
} 

을 경우 당신은 당신이 정지 한 곳에서 계속하려는 경우, 당신은 인덱스를 사용할 수 있습니다

string str = ...; 
string t; 
int i = 0; 

for(; i < str.size(); ++i) { 
    if(str[i] == ' ' || str[i] == '+' || str[i] == '-') 
     break; 
    t.push_back(str[i]); 
} 

// some other code 

++i; // skip ' ', '+' or '-' 
string t2; 

for(; i < str.size(); ++i) { 
    if(str[i] == ' ' || str[i] == '+' || str[i] == '-') 
     break; 
    t.push_back(str[i]); 
}