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>).

Tags:

C++

Cin