cin — c ++, как проверить правильность ввода данных?

Возможный дубликат:
Как проверить пользовательский ввод как двойной в C ++?

Я новичок в C ++, и у меня есть функция, в которой я хочу, чтобы пользователь ввел double значение. Как мне обеспечить, чтобы введенное значение имело правильный тип данных? Кроме того, как будет обработана ошибка? На данный момент это все что у меня есть:

if(cin >> radius){}else{}

Я использую `try {} catch () {}, но я не думаю, что это правильное решение для этой проблемы. Любая помощь будет оценена.

7

Решение

Если ostream& operator>>(ostream& , T&) не удается извлечь отформатированные данные (такие как целое число, двойное число, число с плавающей запятой, …), stream.fail() будет правдой и, таким образом, !stream оценит как истину тоже.

Так что вы можете использовать

cin >> radius;
if(!cin){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin >> radius;
}

или просто

while(!(cin >> radius)){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Это важно ignore остальная часть линии, так как operator>> больше не будет извлекать данные из потока, так как они в неправильном формате. Так что если вы удалите

cin.ignore(numeric_limits<streamsize>::max(), '\n');

Ваш цикл никогда не закончится, так как вход не очищен от стандартного ввода.

Смотрите также:

16

Другие решения

Вам нужно прочитать всю строку, используя std::getline а также std::string, Это способ полностью проверить, что вся строка имеет правильный тип данных:

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;
}
}
3

Этот пример не требует пояснений, однако при таком подходе вы не можете различить int и double.

int main()
{
double number = 0;

if (!(std::cin >> number))
{
std::cout << "That's not a number; ";
}
else
{
std::cout << "That's  a number; ";
}
}
0
По вопросам рекламы [email protected]