Why is a second cin.ignore() necessary?

2019-02-13 21:06发布

问题:

I've noticed that whenever I write a program that uses std::cin that if I want the user to press Enter to end the program, I have to write std::cin.ignore() twice to obtain the desired behavior. For example:

#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?
}

I've also noticed that when I'm not using cin for actual input but rather just for the ignore() call at the end, I only need one.

回答1:

Discl: I'm simplifying what really happens.

The first serves to purge what the extraction operator (>>) hasn't consumed. The second waits for another \n.

It is exactly the same when we do a std::getline after an extraction: a the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); is required before the call to std::getline()



回答2:

That's strange. What platform are you running on? By definition, ignore extracts and discards n characters from the input stream or if it hits EOF it stops. If you do not specify any parameters it extracts 1 character. On Windows, line ending involves both a \r and a \n -- a total of two characters (a carriage return followed by a newline).



标签: c++ input