I recently bought a C++ Primer and got stuck with a problem. I have to read a sequence of words using cin and store the values in a vector. After having unusual problems, I found out that while(cin >> words) invites problems (like infinite loop) if you expect invalid inputs: Using cin to get user input
int main()
{
string words;
vector<string> v;
cout << "Enter words" << endl;
while (cin >> words)
{
v.push_back(words);
}
for(auto b : v)
cout << b << " ";
cout << endl;
return 0;
}
Therefore, I’m trying to find an alternative to this problem. Help ?
That link you provided regarding input problems is a little different. It’s talking about when you expect the user to enter a particular value, but you might fail to read the value (let’s say it’s an integer) because something else was entered. In that case, it’s good to use
getlineto retrieve a whole line of input and then parse the value out.In your case, you’re just after words. When you read a string from a stream, it will give you all consecutive non-whitespace characters. And, ignoring punctuation for a moment, you can call that a “word”. So when you talk about ‘invalid input’, I don’t see what you mean. The loop will continue to give you “words” until there are none left in the stream, at which point it will error:
However, if you expect the user to enter all words on one line and press enter to finish, then you need to use getline:
Or you can do this: