Использование stringstream и переменной int в C ++ для проверки того, что ввод является int - PullRequest
0 голосов
/ 08 сентября 2010
void get_english_input() {
    string input = " ";
    stringstream my_string(input);
    int ft;
    double in;

    while(true) {    
        cout << "Enter an integer value of feet." << endl;
        getline(cin, input);
        my_string << input;
        if(my_string >> ft)
            break;
        cout << "Invalid input! Please try again." << endl;
    }
    cout << "you entered " << ft << " as the int value for feet." << endl;
    /*while(true) {
        cout << "Enter a double value of inches." << endl;
        getline(cin, input);
        my_string << input;
            break;
    cout << "Invalid input! Please try again." << endl;
    }
    cout << "we are done entering english input" << endl;
    cout << "feet = " << ft << endl;
    cout << "inches = " << in << endl;*/
}

Этот код должен проверять, является ли ввод целым числом, пытаясь поместить содержимое my_string в ft. Если я ввожу букву вместо целого числа, я получаю сообщение об ошибке «Неверный ввод! Пожалуйста, повторите попытку», это то, что должно произойти. Проблема в том, что после того, как я получу это сообщение один раз, я получу его для каждого ввода после этого, даже если следующий ввод действителен.


Кто-то предложил мне использовать std :: cin.clear (); для очистки флагов ошибок. Я попытался поместить его перед getline (), и это не изменило проблему. Я использовал это неправильно?

Ответы [ 4 ]

3 голосов
/ 08 сентября 2010

Вы можете сбросить состояние ошибки my_string:

my_string.clear();
my_string.ignore( /* big number of choice */ );

Но я думаю, здесь было бы проще просто заново инициализировать его каждый раз:

while(true) {    
    cout << "Enter an integer value of feet." << endl;
    getline(cin, input);
    stringstream my_string(input);
1 голос
/ 08 сентября 2010
0 голосов
/ 08 сентября 2010

Я думаю,

mystring >> ft

всегда будет оцениваться как истинное (возможно, нет, если mystring была пуста).Операция по-прежнему будет работать независимо от того, содержит ли mystring число или нет.

Одной из идей является

 size_t found=input.find_first_not_of("0123456789 ");
  if (found!=string::npos)
  {
   cout <<   "Invalid input! Please try again."
  }

Адаптировано с здесь.

0 голосов
/ 08 сентября 2010

Грубое решение состоит в том, чтобы сбросить ваш ввод в std :: string, затем перебрать строку и проверить, находится ли каждый символ между 0 и 9.

Это не самый элегантный подход.Но это просто и глупо.: -)

bool isnum(char c)
{
   if(! ( c <= '9' && c >= '0'))
   {  
       return false;
   }
   return true;
}


bool has_int(std::string &s)
{
   for( int i = 0; i < s.length(); i++)
   {
      if( ! isnum(s[i])
      {
         return false;
      }
   }

   return true;
}
...