2016-10-28 12 views
0

文字列の文字列を新しい文字列に追加するwhileループがあります。文字が一旦特定の文字に達すると終了します。' 'ですが、代わりに無限に続きます。 str' ''+'または'-'で始まる場合ここでは、プログラムの一部がループ中に文字が終了しない

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

だループが無限に動作します。最初のトークンをスキップします。それを避けるために、あなたは、ループの前のトークンを読んではいけません。

... 
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をwhileに追加します。終了に達すると、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]); 
} 
関連する問題