2010-11-14 2 views
2

В настоящее время я работаю над программой на C++, и я хочу проверить, действительно ли введен вход пользователя. В настоящее время мой код работает, если пользователь вводит правильный ввод или если пользователь вводит небольшой неправильный номер, моя пограмма сообщит пользователю, что вход недействителен. Теперь моя проблема заключается в том, что, когда пользователь вводит несколько символов/букв или большое число с 9 или более цифрами, моя программа переходит в цикл ввода, который дает сообщение об ошибке. Ниже мой код:Проверка действительного ввода

//for (;;) 
    while (flag== false) 
    { 
     cin >> Input; 
     if (Input <= choice.size()-1) 
     { 
      flag = true; 
    // break; 
     } 

     else 
     { 
      cerr << "Input <" << Input << "> is Invalid, Please Choose a Valid Option\n"; 
      userInput = 0; 
     } 
    } 

Как вы можете видеть, что я также пытался делать в infinate для цикла, но это дает мне одни и те же результаты. В моем коде я печатаю вектор на экране. В основном пользователь выбирает значение вектора для его использования.

Я открыт для любых предложений. Благодаря

+0

возможно дубликат [? Как я могу подтвердить ввод данных пользователем, как двойной в C++] (http://stackoverflow.com/questions/3273993/how-do-i-validate-user -input-as-a-double-in-c) – casablanca

ответ

2

Если пользователь в чем-то, что не могут быть считаны в Input (это не ясно из вашего кода, какой тип Input является), то вход будет застрять во входном потоке, и каждая итерация цикла будет держать неудачу для чтения на входе до тех пор, пока вы не очистите поток.

Вам необходимо очистить флаги потока и избавиться от того, какой плохой вход ожидает в потоке после каждого прочтения. Попробуйте что-то вроде этого:

while(!(cin >> Input) || Input <= choice.size()-1) 
{ 
    cerr << "Input <" << Input << "> is Invalid, Please Choose a Valid Option\n"; 
    cin.clear(); // Clears the input stream fail flag 
    cin.ignore(100, '\n'); // Ignores any characters left in the stream 
} 
+0

'cin.sync()' является лучшим вариантом, чем указание жестко заданного значения, такого как 100. – casablanca

+0

Работает ли 'sync' портативно? http://www.cplusplus.com/reference/iostream/istream/sync/ меньше, чем понятно, о том, что гарантируется выполнение вызова 'sync' on' cin', а комментарии на http://stackoverflow.com/questions/3273993/how-do-i-validate-user-input-as-a-double-in-c не слишком обнадеживают. – user168715

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