2016-12-02 4 views
-1

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

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

_ «Однако, если пользователь вводит число в начале, то программа принимает его, хотя он не должен» _ Можете ли вы рассказать об этом? Значения 'double' принимают числа естественным образом? –

+0

Хорошо, поэтому, если входной сигнал является чем-то вроде «5bffhds» (число как первое), тогда программа не будет считать его неудачным cin, тогда как это так. Валидация работает отлично, если входной сигнал похож на «gfsd3fdj». – PinkieBarto

+0

Проанализируйте ввод в строках строки и используйте 'stod()' для преобразования. –

ответ

0

Типичная идиома для чтения значения в 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; 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^