Как проверить, является ли ввод числовым в С++
Я хочу создать программу, которая принимает целочисленный ввод от пользователя, а затем завершается, когда пользователь ничего не вводит (т.е. просто нажимает enter). Тем не менее, у меня возникают проблемы с проверкой ввода (убедитесь, что пользователь вводит целые числа, а не строки. Atoi() не будет работать, поскольку целые входы могут быть более одной цифры.
Каков наилучший способ проверки этого ввода? Я попробовал что-то вроде следующего, но я не уверен, как его завершить:
char input
while( cin>>input != '\n')
{
//some way to check if input is a valid number
while(!inputIsNumeric)
{
cin>>input;
}
}
Ответы
Ответ 1
Когда cin
получает вход, он не может использовать, он устанавливает failbit
:
int n;
cin >> n;
if(!cin) // or if(cin.fail())
{
// user didn't input a number
cin.clear(); // reset failbit
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input
// next, request user reinput
}
Когда установлен cin
failbit
, используйте cin.clear()
до reset состояние потока, затем cin.ignore()
, чтобы удалить оставшийся вход, а затем запросить повторный ввод пользователя. Поток будет ошибочно работать до тех пор, пока будет установлено состояние отказа, и поток содержит плохой ввод.
Ответ 2
Откройте std::isdigit()
функцию.
Ответ 3
Проблема с использованием
cin>>number_variable;
заключается в том, что когда вы вводите значение 123abc, оно пройдет, и ваша переменная будет содержать 123.
Вы можете использовать регулярное выражение, что-то вроде этого
double inputNumber()
{
string str;
regex regex_pattern("-?[0-9]+.?[0-9]+");
do
{
cout << "Input a positive number: ";
cin >> str;
}while(!regex_match(str,regex_pattern));
return stod(str);
}
Или вы можете изменить regex_pattern для проверки всего, что вы хотели бы.
Ответ 4
Я использую boost::lexical_cast
для такого рода вещей все время в наши дни.
Пример:
std::string input;
std::getline(std::cin,input);
int input_value;
try {
input_value=boost::lexical_cast<int>(input));
} catch(boost::bad_lexical_cast &) {
// Deal with bad input here
}
Шаблон работает так же хорошо для ваших собственных классов, при условии, что они удовлетворяют некоторым простым требованиям (поточность в нужном направлении, конструкторы по умолчанию и копии).
Ответ 5
Почему бы просто не использовать scanf ( "% я" ) и проверить его возврат?
Ответ 6
Я думаю, ctype.h - это заголовочный файл, который вам нужно посмотреть. он имеет множество функций для обработки цифр, а также символов.
isdigit или iswdigit - это то, что поможет вам в этом случае.
Вот ссылка:
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/isdigit_xml.html
Ответ 7
Если у вас уже есть строка, вы можете использовать эту функцию:
bool isNumber( const string& s )
{
bool hitDecimal=0;
for( char c : s )
{
if( c=='.' && !hitDecimal ) // 2 '.' in string mean invalid
hitDecimal=1; // first hit here, we forgive and skip
else if( !isdigit( c ) )
return 0 ; // not ., not
}
return 1 ;
}