2014-01-12 2 views
-1

Когда я выполняю этот код и вводим строку (символов) для n, он не позволяет мне вводить новый ввод, даже если я звоню clear(). Программа заканчивается, и я не могу ввести значение в p.cin.clear() не позволяет мне вводить новый ввод

#include <iostream> 
#include <string> 
#include <ios> 
#include <vector> 
#include <iomanip> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    int n,p; 
    cin >> n; 
    cin.clear(); 
    cin >> p; 

    return 0; 
} 
+1

Покажите нам, что вы предоставляете в качестве входных данных. 'Clear()', вероятно, недостаточно, вам, скорее всего, придется «игнорировать» некоторые символы. – 0x499602D2

+0

Вам лучше также показать, какую последовательность входных данных вы тестировали, что вызвало проблему. – user534498

+0

Звучит как прекрасный пример для [тестовых случаев] (http://kera.name/articles/2013/10/nobody-writes-testcases-any-more/). Простой оператор 'std :: cout' может диагностировать проблему. Если 'n' не является ожидаемым выходом, вы знаете, что извлечение завершилось неудачно. –

ответ

2

Когда вы вводите строку символов, и поток не может извлечь этот символ, вы должны указать ignore оставшиеся символы до следующей строки. Это делается с использованием ignore, но с максимальным количеством символов в качестве суммы для игнорирования и '\n' в качестве нашего разделителя. Вы также должны проверить, удалось ли ввести ваш вход:

if (!(std::cin >> n) || !(std::cin >> p)) 
{ 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 
+0

в книге Андрея Кенига «Ускоренный C++» приведен пример использования 'cin.clear()', где вы хотите снова ввести ввод, и используете эту функцию, не используя 'ignore'. Как это возможно? – LearningMath

+0

@ J.M Каков был пример, который он предоставил? – 0x499602D2

+0

вот функция, которая используется в: http://tny.cz/be2938ee – LearningMath

0

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

+0

Характер EOF не является проблемой. – 0x499602D2

+0

@ 0x499602D2 EOL! = EOF –

+0

Символ «EOL» также не является проблемой, так как ведущие пробелы (включая новые строки) отбрасываются из потока во время каждой операции ввода по умолчанию. Скорее всего, проблема в том, что у него больше данных в потоке, которые он должен «игнорировать». – 0x499602D2

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