2014-08-28 2 views
0

У меня есть string как "ABC DEF " с пробелом в конце. Я хотел бы, чтобы превратить его в vector строк, как {"ABC" "DEF"}, так что я использовал stringstream:Разделить строку на вектор слов

string s = "ABC DEF "; 
stringstream ss(s); 
string tmpstr; 
vector<string> vpos; 
while (ss.good()) 
{ 
    ss >> tmpstr; 
    vpos.push_back(tmpstr); 
} 

Однако результат vpos является {"ABC" "DEF" "DEF"}. Почему последнее слово будет дублироваться в векторе? И каков правильный код, если требуется использовать stringstream?

+0

@CaptainObvlious: Не совсем, нет. –

+0

Базовая логика: 'ss.good()' не может сказать будущее! –

+0

@LightnessRacesinOrbit - совершенно верно. Закрытое голосование отменено. –

ответ

4

ss.good() только говорит вам, хорошо ли до сих пор. Это не говорит вам, что следующее, что вы прочтете, будет хорошим.

Использование

while (ss >> tmpstr) vpos.push_back(tmpstr); 

Сейчас вы читаете tmpstr первый, а затем проверить состояние потока. Это эквивалентно этому:

for (;;) { 
    istream &result = ss >> tmpstr; 
    if (!result) break; 
    vpos.push_back(tmpstr); 
} 
+0

Спасибо за этот ответ. Я нашел возвращаемое значение типа 'istream', поэтому я написал' while (istream obj = ss >> tmpstr) ', но это кажется неправильным. Итак, что такое синтаксис за 'ss >> tmpstr'? –

+0

Спасибо за ваше объяснение! Я многому научился. –

Смежные вопросы