Проверка не работает должным образом для переполнения двойного стека

Я пытаюсь проверить ввод для двойного типа данных, отчасти это удается, так как он выведет сообщение об ошибке, если первое, что вводит пользователь, — это буква, однако, если пользователь вводит число в начале, программа его принимает, хотя это не должно Любые идеи о том, как это исправить? Вот мой код до сих пор:

void circleArea(double pi)
{
double radius = 0.0;
bool badInput;

do
{
cout << "*================*\n";
cout << " Area of a circle\n";
cout << "*================*\n\n";
cout << "Please enter the radius of your circle (numerics only):\n\n";
cin >> radius;

badInput = cin.fail();
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
} while (badInput == true);

system("CLS");
cout << "The area of your Circle is:\n\n" << radius*radius*pi << "cm^2" << endl << endl;
exitSystem();
}

-1

Решение

Типичная идиома — прочитать значение в if заявление:

cout << "*================*\n";
cout << " Area of a circle\n";
cout << "*================*\n\n";
cout << "Please enter the radius of your circle (numerics only):\n\n";
if (!(cin >> radius))
{
cerr << "Invalid input, try again.\n";
}
else
{
// radius is valid
}

Это не относится к случаю числа, за которым следует буква или недопустимые символы, такие как «1.23A» или «1 # 76». В этих случаях вам нужно будет прочитать текст в виде строки и выполнить более детальный анализ.

0

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

Другая возможность — использовать регулярные выражения, чтобы проверить, является ли введенная строка строкой!

// Example program
#include <iostream>
#include <string>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>

const boost::regex is_number_regex("^\\d+(()|(\\.\\d+)?)$");
//If I didn't make a mistake this regex matches positive decimal numbers and integers
int main()
{
double radius;
std::string inputstring;
std::cin >> inputstring;
boost::smatch m;
if( boost::regex_search(inputstring, m, is_number_regex))
{
radius = boost::lexical_cast<double>( inputstring );
std::cout <<"Found value for radius:  "<< radius << std::endl;
}
else
{
std::cerr << "Error" << std::endl;
}
}

Адаптируйте регулярные выражения, если вам нужны отрицательные числа, научные числа, …

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector