2016-10-28 8 views
0

Okay, ich habe eine while-Schleife, um Zeichen aus einer Zeichenfolge zu einer neuen Zeichenfolge hinzuzufügen, und es soll beendet werden, sobald es ein bestimmtes Zeichen vor allem ' ' erreicht, sondern stattdessen endlos fortfährt. Hier ist ein Stück des Programmschar nicht terminieren while-Schleife

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

add ' istr && 'in die 'while'-Bedingung, so dass es Eingabefehler entdeckt –

+0

Wenn Sie auf eine Zeichenfolge in cpp iterieren möchten, schauen Sie sich diese [Frage] (http://stackoverflow.com/questions/9438209/for-every-character- In-String) – Stargateur

+0

Wenn 'istr' das Dateiende eines Fehlers erreicht, ist jedes nachfolgende' >> 'ein No-Op und schreibt nichts. Also, "Token" ist keine Änderung und die 'ẁhile'-Bedingung wird das gleiche Ergebnis bei jeder Schleife ergeben. Deshalb geht es endlos weiter. –

Antwort

3

Schleife wird unendlich funktionieren, wenn str beginnt mit ' ', '+' oder '-'. Sie werden das erste Token überspringen. Um es zu vermeiden, sollten Sie nicht zwei Token vor Schleife lesen:

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

Der zweite Fall ist ein leerer str. Sie sollten prüfen, ob es leer ist und es in diesem Fall nicht verarbeiten.

Auch wenn str enthält keine ' ', '+' oder '-', Schleife wird nicht aufhören. Um es am Ende von istr zu stoppen, fügen Sie Fall istr zu While hinzu. Wenn das Ende erreicht ist, wird istr zu false und die Schleife stoppt.


Auch kann es tun, ohne istringstream:

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

Im Fall, wenn Sie von der Stelle fortsetzen möchten, wo Sie aufgehört haben, können Sie Indizes verwenden:

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]); 
} 
Verwandte Themen