2015-03-03 2 views
0

После ввода целого числа и нажатия ENTER, новая строка сохраняется.
Итак, когда я делаю char c = cin.get(), ранее введенная строка новой строки назначается переменной c. Следующий цикл пропускается из-за этого.
. Как очистить содержимое от cin? Или как избежать чтения новой строки?Как очистить содержимое, прочитанное cin

программа:

char s; 
int T; 
cin >> T; // pressing ENTER here. 
while(T--) 
{ 
    s = cin.get(); // storing the previously pressed ENTER.('\n') 
    while(s != '\n') // does not execute. 
    { 
    . 
    . 
    . 
    . 
    . 
    . 
    } 
} 
+0

Есть ли причина, по которой вы не используете форматированный вход? – utnapistim

+0

@utnapistim Мне нужно читать по одному персонажу за раз и выполнять некоторые задания на прочитанном символе. – Pradeep

ответ

2
std::cin.ignore(); 

игнорировать один символ.

std::cin.ignore(n); 

игнорировать n символов.

std::cin.ignore(std::numeric_limits<std::streamsize>::max()); 

игнорировать все символы.

При необходимости добавьте второй параметр для определения разделительного символа. По умолчанию используется EOF.

+1

... до разделителя, по умолчанию EOF. Вы можете упомянуть об этом или, что еще лучше, использовать '' \ n'' в качестве разделителя. – Angew

+0

@ Ангела Добавлено. Благодарю. – emlai

+0

@ Angew Действительно ли EOF символ или состояние 'std :: istream' (или оба)? –

0

Ответ от @zenith правильный. В дополнение к этому, посмотрите также std::cin.peek().

Вот код:

char s; 
int T; 
cin >> T; // pressing ENTER here. 
while(T--) 
{ 
    while(std::isspace(cin.peek())) // peek used here 
    cin.ignore(); // ignore spaces, tabs and enter 
+0

Вы также можете использовать 'getline()' (это не эквивалентно вообще, но это эквивалентно случаю OP для чтения целого числа и игнорирования остальной части строки). –

1

У вас есть несколько вариантов.

Вы можете просто позвонить по номеру cin.getline(), который будет извлекать оставшуюся часть строки, включая символы новой строки, и оставить указатель в начале следующей строки. Работает до тех пор, пока вы знаете, что остальная часть входной строки не знает.

Вы также можете использовать cin.ignore(1) или cin.ignore(2), если вы знаете новая строка в следующем. Для входных потоков, которые генерируют CR + LF вместо одного, вам придется игнорировать два символа, и вам решать, получать ли CR или CR + LF.

Другой вариант - использовать cin.peek(), чтобы проверить, что следующий символ опережает время. Таким образом, вы можете использовать пропустить новые строки без использования символов, отличных от новой строки. Например:

void skipNewlines (istream &in) { 
    int ch; 
    while ((ch = in.peek()) == '\r' || ch == '\n') 
     in.ignore(); 
    // and now newlines skipped and next in.get() will read the next char. 
} 

Вы можете изменить это, чтобы пропустить все пробелы. Этот вариант, вероятно, работает наиболее плавно с использованием cin >> T.

Вы также можете рассмотреть возможность написания собственной функции ввода символов, которая читает следующий символ, но игнорирует разрывы строк (или что-то еще). Например:

int getWithoutNewline (istream &in) { 
    int ch; 
    do { 
     ch = in.get(); 
    } while (ch == '\n' || ch == '\r'); 
    return ch; 
} 

Затем используйте getWithoutNewline(cin) вместо cin.get() читать символы при разборе ваших чисел. У вас есть гибкость; вы можете, например, перевести новые строки в пробелы. Это имеет то преимущество, что вы можете работать без вас, чтобы знать что-либо о местоположении или форме разрыва строки. Однако он может не работать для всех ситуаций.

Лично я не стал бы приближаться к слепому отбрасыванию всего содержимого.Я даже не уверен, что это возможно, учитывая, что после каждой строки нет конца файла. Самое близкое приближение к тому, что вы просите, насколько это возможно, - просто позвонить getline(), чтобы читать и использовать оставшуюся часть строки (включая строки перевода).

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