Разделение строки в целые числа с помощью 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/