2016-10-28 12 views
0

Хорошо, у меня есть цикл while, чтобы добавить символы из одной строки в новую строку, и она должна заканчиваться, когда она достигает определенного символа, в основном ' ', но вместо этого она продолжается бесконечно. Вот фрагмент программыchar не завершается во время цикла

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, посмотрите этот [вопрос] (http://stackoverflow.com/questions/9438209/for-every-character- в струне) – Stargateur

+0

Если 'istr' достигает конца файла, есть какой-либо сбой, любой последующий' '' '' 'не-op и ничего не пишет. Таким образом, «токен» не изменяется, и условие «ẁhile» даст тот же результат в каждом цикле. Вот почему он продолжается бесконечно. –

ответ

3

Loop будет работать бесконечна, если 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. Когда конец будет достигнут, istr 'станет false, и цикл остановится.


Также можно сделать это без 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]); 
}