2016-03-01 2 views
2

Я хочу, чтобы программа зациклилась до тех пор, пока вход не будет действителен (x - это int и x> 0), но моя программа принимает вход, когда я даю ему 1,1 и бесконечно петляет, когда я введите строку, повторяя «Неверный ввод!».Проблемы с проверкой ввода в C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    bool fail; 
    int x; 
    do{ 
     cin >> x; 
     fail=(cin.fail() || x<=0); 
     if (fail){ 
      cout << "Wrong input!" <<endl; 
      cin.clear(); 
     }; 
    }while(fail); 
    return 0; 
} 

ответ

2

Использовать стандартную функцию-член ignore в инструкции if. Например

std::cin.ignore(std::numeric_limits<std::streamsize>::max(),’\n’); 

или просто

std::cin.ignore(); 

Он используется для пропуска недопустимых символов в буфере.

+0

Должен ли я использовать его вместо cin.clear()? – R2DToo

+0

@ R2DToo Вставьте вызов до cin.clear() –

+0

Все еще держит цикл навсегда для ввода «asd» .. И для «1.1» он возвращает 1 – R2DToo

0

Вы можете прочитать всю строку и преобразовать строку со струнным потока:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    bool fail; 
    int x; 
    do{ 
     std::string line; 
     fail = ! getline(std::cin, line); 
     if(! fail) { 
      std::istringstream s(line); 
      fail = ! (s >> x) 
       || x < 0 
       || ! s.eof(); // The entire line represents an integer 
     } 
     if(fail) { 
      std::cout << "Wrong input!" << std::endl; 
     }; 
    } while(fail); 
    return 0; 
} 
+0

Да, это работает! Благодаря! – R2DToo

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