2016-12-18 4 views
2

Я новичок в C++, и я использую Visual Studio 2015.Cin, не дожидаясь ввода, несмотря на cin.ignore()

cin не ждет ввода после "Please enter another integer:\n" и выходов "You entered 0" каждый раз.

Я искал в Интернете больше часа без решения. Никакая комбинация cin.ignore() не работает. Почему буфер cin еще не очищен?

#include <iostream> 
#include <vector> 
using namespace std; 

int main() { 
     vector<int> vals; 
     int val = 0; 
     int n = 0; 

     cout << "Please enter some integers (press a non-numerical key to stop)\n"; 
     while (cin >> val) 
      vals.push_back(val);   

     cin.ignore(INT_MAX, '\n'); 
     cin.ignore(); 

     cout << "Please enter another integer:\n"; 

     cin.ignore(); 

     cin >> n; 
     cout << "You entered " << n; 

     system("pause"); 
     return 0; 
} 
+0

Посмотрите первый здесь HTTP: // stackoverflow.com/questions/4258887/semantics-of-flags-on-basic-ios, а затем здесь http://stackoverflow.com/questions/10379274/wrong-inputs-will-cause-the-program-to-exit/10379322 # 10379322 –

ответ

2

Проблема заключается в том, что пользователь должен выйти из цикла, в котором вам нужно поставить cin в состояние отказа. Вот почему ваш

while(cin >> val){ .... } 

работает.

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

Было бы также добротность использовать

if(cin >> n){ 
    cout << "You entered " << n; 
} 

Это утверждать, что был обеспечен надлежащий вход для n.

+0

'cin.clear();' follow 'cin.ignore (INT_MAX,' \ n '); 'работает – user6616363

+0

@ user6616363' std :: numeric_limits :: max() 'как первый аргумент для игнорирования предпочтительнее д. –

0

Проблема в вашей программе заключается в том, что она ожидает целые числа, тогда как пользователь может вводить что угодно, например, нецелый символ.

Лучший способ сделать то, что вы хотите сделать, это прочитать символы один за другим, проигнорировать пробелы, а если это цифра, то продолжайте читать, чтобы получить целое число, иначе остановите цикл. Затем вы можете прочитать все символы, пока не достигнете «\ n», и сделайте то же самое для одного номера. Пока вы это делаете, для каждого символа вы должны проверить, что все еще могут быть символы в потоке с помощью cin.eof().

Кроме того, вместо использования системы («пауза») вы можете предотвратить закрытие окна командной строки, запросив последний символ перед завершением работы приложения.

-1

Попробуйте получить ваши целые числа, как это:

#include <sstream> 

... 
fflush(stdin); 
int myNum; 
string userInput = ""; 

getline(cin, userInput); 
stringstream s (userInput); 
if (s >> myNum) // try to convert the input to int (if there is any int) 
    vals.push_back(myNum); 

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

+0

входные потоки не генерируют исключения при сбое. –

+0

sstream вернет true, если все хорошее и ложное, если была ошибка – YouneS

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