I'm validating string input in C++, to make sure that the input is not empty. I know how to do it using the empty()
function with getline()
, but I want to know why it's not working when I use cin
. When I use empty()
with cin
, I press enter to try and skip the input, but the empty()
never returns true, so I never get re-prompted to enter the string. Is this because the '\n'
left in the buffer from cin is counted? I would greatly appreciate the explanation for this.
string name;
cout << "Enter your name: ";
cin >> name;
while (name.empty())
{
cerr << "Name can't be empty" << '\n';
cout << "Enter your name: ";
cin >> name;
}
By default, operator>>
ignores leading whitespace (you can use std::noskipws
) to disable that), and then it stops reading on trailing whitespace. In this case, whitespace includes the Enter key.
So, the operator can never return an empty std::string
value on success, only on failure (which your example is not checking for), as the std::string
is erase()
'ed before the operator attempts to read it:
string name;
cout << "Enter your name: ";
if (cin >> name)
{
// success, name.empty() SHOULD always be false here...
}
else
{
// fail, name.empty() SHOULD always be true here...
}