Подтвердить что ты не робот

Как проверить, является ли ввод числовым в С++

Я хочу создать программу, которая принимает целочисленный ввод от пользователя, а затем завершается, когда пользователь ничего не вводит (т.е. просто нажимает enter). Тем не менее, у меня возникают проблемы с проверкой ввода (убедитесь, что пользователь вводит целые числа, а не строки. Atoi() не будет работать, поскольку целые входы могут быть более одной цифры.

Каков наилучший способ проверки этого ввода? Я попробовал что-то вроде следующего, но я не уверен, как его завершить:

char input

while( cin>>input != '\n')
{
     //some way to check if input is a valid number
     while(!inputIsNumeric)
     {
         cin>>input;
     }
}
4b9b3361

Ответ 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(), чтобы удалить оставшийся вход, а затем запросить повторный ввод пользователя. Поток будет ошибочно работать до тех пор, пока будет установлено состояние отказа, и поток содержит плохой ввод.

Ответ 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 ( "% я" ) и проверить его возврат?

Ответ 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 ;
}