Разделение строки в целые числа с помощью istringstream в C++

Я пытаюсь использовать istringstream разбить строку на ряд целых чисел:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main(){

    string s = "1 2 3"; 
    istringstream iss(s);   

    while (iss)
    {
        int n;
        iss >> n;
        cout << "* " << n << endl;
    } 
}

а я:

* 1
* 2
* 3
* 3

почему последний элемент всегда выходит дважды? Как это исправить?

2 ответов


он выходит дважды, потому что ваш цикл неправильный, как объяснено (косвенно) в http://www.parashift.com/c ++ - faq-lite / вход-выход.HTML # faq-15.5 (while (iss) не отличается от while (iss.eof()) в этом случае).

в частности, на третьей итерации цикла, iss >> n преуспевает и получает свой 3, и оставляет поток в хорошем состоянии. Затем цикл запускается в четвертый раз из-за этого хорошего состояния, и это не до следующего (четвертого) iss >> n впоследствии не что условие цикла нарушено. Но до того, как закончится четвертая итерация, вы все равно выведете n... четвертый раз.

попробуй:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
    string s = "1 2 3"; 
    istringstream iss(s);   
    int n;

    while (iss >> n) {
        cout << "* " << n << endl;
    } 
}

надеюсь, это поможет:
МКС : 1 2 3
итерация 1
ИСС: 1 2 3 (Изначально)
n=1
iss: 2 3
//* 1 печатается
итерация 2:
iss: 2 3 (Изначально)
n=2
iss: 3
//* 2 напечатано:
итерация 3
iss: 3
n=3
МКС : "
итерация 4
МКС : "
N не изменено//флаг установлен для eof МКС как не далее ввод из потока
МКС : "

и, как справедливо упоминалось выше, сообщение while (iss) не отличается от while (iss.ВФ.))(
Внутренне функция (istream:: operator>>) обращается к входной последовательности, сначала построив постовой object (с noskipws установлено значение false[это означает, что пространство является разделителем, и ваш список будет 1,2,3]). Тогда (если хороший[здесь eof не достиг]), он вызывает num_get:: get [получить next integer] для выполнения операций извлечения и синтаксического анализа, соответствующим образом настраивая флаги внутреннего состояния потока. Наконец, он уничтожает объект sentry перед возвращением.

см.:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/