Я пытаюсь использовать безопасные методы в обработке входа с числами только в C++, таким образом, я использую объект stringstream в качестве так:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
int first, second;
string input;
stringstream sstream;
cout << "First integer: ";
getline(cin, input);
sstream.str(input);
sstream >> first;
cout << first << endl; //display user input in integers
cout << "Second integer: ";
getline(cin, input);
sstream.str(input);
sstream >> second;
cout << second << endl; //display user input in integers
getline(cin, input); //pause program
return 0;
}
Однако второй раз вокруг этого, кажется, дает переменной 'секунде' произвольное значение. Это - вывод:
First integer: 1
1
Second integer: 2
2293592
Если я объявляю два объекта stringstream и использую их соответственно для обеих переменных, это, кажется, хорошо работает. Это означает, что я не могу снова использовать объект stringstream в способе, которым я пытаюсь сделать? В моей реальной программе я намереваюсь обработать намного больше чем два входных значения от пользователя, таким образом, я просто хочу удостовериться, существует ли иначе вместо того, чтобы делать несколько объектов stringstream. Я сомневаюсь, что это имеет большую уместность, но я нахожусь на Windows XP, и я использую MinGW в качестве своего компилятора.
Я значительно ценю любую справку.
Используйте sstream.clear();
после sstream >> сначала;
.
Лучший способ сделать это преобразование между типорами данных было бы использовать Boost :: Lexical_Cast
.
Информация и примеры можно найти на уровне Boost Boost .
Ниже приведен пример выполнения конвертации строки и обратно (строка для INT), таких как то, что вы делаете в вашей программе.
#include <string>
#include <boost/lexcal_cast.hpp>
int main(int argc, char *argv[])
{
int i = 42;
std::string s = boost::lexical_cast<std::string>(i);
int j = boost::lexical_cast<int>(s);
return 1;
}
Вам необходимо сбросить состояние StringStream
. Как правило, это включает в себя два шага: очистка буфера:
sstream.str("");
и сброс флагов состояния ошибки:
sstream.clear();
Если вы не очищаете буфер, если вы получите вход «123ABC», то «ABC» все еще будет Поток, когда вы пытаетесь прочитать от него в следующий раз.
Вы также должны обязательно проверить состояние провала потока ( SSEReam.fail ()
), чтобы убедиться, что экстракция была успешной. Если вы хотите быть уверены, что пользователь вводил только в целом (т. Е. Вы хотите предотвратить ввод пользователя, скажем, «123ABC», то вам следует проверить, чтобы убедиться SSTReam.eOF ()
правда.
cout << "First integer: ";
getline(cin, input);
sstream.str(input);
sstream >> first; // state of sstream may be eof
cout << "Second integer: ";
getline(cin, input);
sstream.str(input);
sstream.clear(); // clear eof state
sstream >> second; // input from sstream