2013-06-05 4 views
5

Я попытался запросить пользователя для ввода и выполнить проверку. Например, моя программа должна принимать 3 пользовательских ввода. Когда он попадает не целой, он будет печатать сообщение об ошибке и снова запрашивать ввод. Вот как моя программа будет выглядеть при работе:Проверка целочисленности для ввода

Введите номер: в

Неправильный ввод

Введите номер: 1

Введите номер: б

Неправильный вход

Введите число: 2

Введите число: 3

введенного числа 1,2,3

И вот мой код:

double read_input() 
{ 
    double input; 
    bool valid = true; 
    cout << "Enter number: " ; 
    while(valid){ 
     cin >> input; 
     if(cin.fail()) 
     { 
      valid = false; 
     } 
    } 
    return input; 
} 

Мой главный метод:

int main() 
{ 
double x = read_input(); 
double y = read_input(); 
double z = read_input(); 
} 

Когда мой первый вход нецелый, программа просто выходит сама по себе. Он не запрашивает приглашение снова. Как я мог ее исправить? Или я должен использовать цикл do while, так как я прошу ввести пользователя.

Заранее спасибо.

+0

мы должны увидеть больше кода .. вы проверили его с помощью отладчика? может быть сбой ... –

+0

внутри основного метода Я просто пишу double x = read_input(); double y = read_input(); double z = read_input(); Я делаю неправильный путь? –

ответ

7

Когда считывание не удается, вы установите valid в false, поэтому условие в цикле while является false и программа возвращает input (который не инициализирован, кстати).

Вы также должны очистить буфер перед использованием его снова, что-то вроде:

#include <iostream> 
#include <limits> 

using namespace std; 

double read_input() 
{ 
    double input = -1; 
    bool valid= false; 
    do 
    { 
     cout << "Enter a number: " << flush; 
     cin >> input; 
     if (cin.good()) 
     { 
      //everything went well, we'll get out of the loop and return the value 
      valid = true; 
     } 
     else 
     { 
      //something went wrong, we reset the buffer's state to good 
      cin.clear(); 
      //and empty it 
      cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
      cout << "Invalid input; please re-enter." << endl; 
     } 
    } while (!valid); 

    return (input); 
} 
+0

Когда я помещал инструкцию cout in else и я вводил не целое число, само сообщение об ошибке просто продолжает цикл. –

+0

Я не могу проверить код, но Ideone имеет тот же результат, позвольте мне проверить, почему. – Djon

+0

@Carol Это работает сейчас, я думаю, это был порядок между 'clear' и' ignore': http://ideone.com/fl4IMK – Djon

0

Ваш вопрос действительно получил себя в других вопросах, как очистка CIN на сбою() -

double read_input() 
{ 
double input; 
int count = 0; 
bool valid = true; 
while(count != 3) { 
    cout << "Enter number: " ; 
    //cin.ignore(); 
    cin >> input; 
    if(cin.fail()) 
    { 
     cout << "Wrong Input" <<endl; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    else 
      count++; 
} 
return input; 
} 
0

проблема заключается в том состоянии, в то время как

bool valid = true; 
while(valid){ 

вы цикл, пока вы не получите недопустимый ввод, это абс совершенно не то, что вы хотите! условие цикла должно быть, как это

bool valid = false; 
while(! valid){ // repeat as long as the input is not valid 

Вот модифицированная версия вашего read_double

double read_input() 
{ 
    double input; 
    bool valid = false; 
    while(! valid){ // repeat as long as the input is not valid 
     cout << "Enter number: " ; 
     cin >> input; 
     if(cin.fail()) 
     { 
      cout << "Wrong input" << endl; 

      // clear error flags 
      cin.clear(); 
      // Wrong input remains on the stream, so you need to get rid of it 
      cin.ignore(INT_MAX, '\n'); 
     } 
     else 
     { 
      valid = true; 
     } 
    } 
    return input; 
} 

И в главном вы должны спросить как это может двойников, как вы хотите, например

int main() 
{ 
    double d1 = read_input(); 
    double d2 = read_input(); 
    double d3 = read_input(); 

    cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl; 

    return 0; 
} 

Вы также можете иметь петлю, в которой вы вызываете read_double() и сохраняете возвращаемые значения в массиве.

+0

Хорошо, спасибо большое. Я использовал cin.clear() и getline in else, и теперь он работает –

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