Problem of using cin twice

gc . picture gc . · Mar 26, 2010 · Viewed 8.7k times · Source

Here is the code:

string str;
cin>>str;
cout<<"first input:"<<str<<endl;
getline(cin, str);
cout<<"line input:"<<str<<endl;

The result is that getline never pauses for user input, therefore the second output is always empty.

After spending some time on it, I realized after the first call "cin>>str", it seems '\n' is still stored in cin (using cin.peek() to check), which ends getline immediately. The solution will be adding one more line between the first usage and the second one: cin.ignore(numeric_limits::max(), '\n');

However, I still don't understand, why is '\n' left there after the first call? What does istream& operator>> really do?

Answer

fbrereto picture fbrereto · Mar 26, 2010

The \n is left in the input stream as per the way operator>> is defined for std::string. The std::string is filled with characters from the input stream until a whitespace character is found (in this case \n), at which point the filling stops and the whitespace is now the next character in the input stream.

You can also remove the \n by calling cin.get() immediately after cin>>str. There are many, many different ways of skinning this particular I/O cat, however. (Perhaps a good question in and of itself?)