2009-03-10 2 views
5

Я заметил, что всякий раз, когда я пишу программу, которая использует std::cin, если я хочу, чтобы пользователь нажимал Enter, чтобы закончить программу, я должен написать std::cin.ignore() дважды, чтобы получить желаемое поведение. Например:Почему нужен второй cin.ignore()?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

Я также заметил, что, когда я не использую cin для фактического ввода, но довольно просто для ignore() вызова в конце концов, мне нужно только одно.

+0

Вы используете Linux или Windows, это может быть из-за проблема CRLF при запуске Windows ... – Ben

+0

Такая же проблема возникает в Solaris. Это не имеет никакого отношения к CRLF. –

ответ

8

Discl: Я упрощаю то, что на самом деле происходит.

Первый служит для очистки того, что не использовал потребляющий оператор (>>). Второй ждет другого \ n.

Это точно так же, когда мы делаем зЬй :: GetLine после экстракции: а the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); требуется перед вызовом StD :: GetLine()

+3

А я вижу. Итак, если символы, введенные в первом приглашении, - «123 \ n», вы говорите, что оператор >>() оставляет это «\ n» в покое, а первый ignore() читает его; то второй игнорирует() ждет, пока вы нажмете клавишу и читаете это (2-й «\ n»). +1. –

+0

Это идея. –

0

Это странно. На какой платформе вы работаете? По определению ignore извлекает и отбрасывает n символов из входного потока или если он попадает в EOF, он останавливается. Если вы не укажете какие-либо параметры, он выберет 1 символ. В Windows окончание строки включает в себя как \r, так и \n - всего двух символов (возврат каретки, за которым следует новая строка).

+0

Я думал, что сначала также, но библиотека должна абстрагироваться от любой схемы окончания строки, используемой платформой, и ваш код приложения должен видеть только «\ n». –

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