c++, how to verify is the data input is of the correct datatype
You need to read the entire line using std::getline
and std::string
. That is the way to fully verify that the entire line is of the correct data type:
std::string line;
while(std::getline(std::cin, line))
{
std::stringstream ss(line);
if ((ss >> radius) && ss.eof())
{
// Okay break out of loop
break;
}
else
{
// Error!
std::cout << "Invalid input" << std::endl;
}
}
If ostream& operator>>(ostream& , T&)
fails the extraction of formatted data (such as integer, double, float, ...), stream.fail()
will be true and thus !stream
will evaluate to true too.
So you can use
cin >> radius;
if(!cin){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin >> radius;
}
or simply
while(!(cin >> radius)){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
It is important to ignore
the rest of the line, since operator>>
won't extract any data from the stream anymore as it is in a wrong format. So if you remove
cin.ignore(numeric_limits<streamsize>::max(), '\n');
your loop will never end, as the input isn't cleared from the standard input.
See also:
std::basic_istream::ignore
(cin.ignore
)std::basic_istream::fail
(cin.fail()
)std::numeric_limits
(used for the maximum number of ignored characters, defined in<limits>
).