Возможный дубликат:
Как проверить пользовательский ввод как двойной в C ++?
Я новичок в C ++, и у меня есть функция, в которой я хочу, чтобы пользователь ввел double
значение. Как мне обеспечить, чтобы введенное значение имело правильный тип данных? Кроме того, как будет обработана ошибка? На данный момент это все что у меня есть:
if(cin >> radius){}else{}
Я использую `try {} catch () {}, но я не думаю, что это правильное решение для этой проблемы. Любая помощь будет оценена.
Если 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');
Ваш цикл никогда не закончится, так как вход не очищен от стандартного ввода.
Смотрите также:
std::basic_istream::ignore
(cin.ignore
)std::basic_istream::fail
(cin.fail()
)std::numeric_limits
(используется для максимального количества игнорируемых символов, определенного в <limits>
).Вам нужно прочитать всю строку, используя 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;
}
}
Этот пример не требует пояснений, однако при таком подходе вы не можете различить 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; ";
}
}