Nick Chapman
Nick Chapman

Reputation: 4634

How do you flush the contents of `std::cin` before an additional read from it?

I am trying to read a single character multiple times. The catch is that I need to prevent user errors. So for example:

char arr[10];
for(int i = 0; i < 10; i++)
{
    cin.get(arr[i]);
} 

Where the inputs should be something like a, b, c, d, .... But if someone were to enter ab for the first entry I want to capture the a and then ignore the b. I know about cin.ignore however I don't know how I would go about ignoring an arbitrary number of alphanumeric characters or symbols considering that I want to ignore a potentially unlimited number of characters and then stop ignoring and read again.

How can I either ignore an arbitrary number of characters and then stop ignoring or how can I actually flush the buffer for cin.

Upvotes: 0

Views: 539

Answers (3)

Santosderek
Santosderek

Reputation: 106

The following is the code that you want, if your inputing like this a 'enter' b 'enter' c 'enter' etc...

#include <iostream>
#include <string>

using namespace std;

int main() {


    char arr[10];
    string line;

    for (int i = 0; i < 10; i++)
    {
        getline(cin, line);
        arr[i] = line[0];

        cout << endl << "Here is the Char: " << arr[i] << endl;
    }



    return 0;
}

BUT if you enter input like this in one line: a,b,c,d,e,f,g,h,i,j 'enter' then you want the following code:

#include <iostream>
#include <string>

using namespace std;

int main() {


    char arr[10];
    string line;
    int i = 0;
    size_t  end;



        getline(cin, line);

        end = 0;
        int counter = 0;



            if (line != "") {

                while (end != string::npos && counter < 10) {

                    if (counter == 0) {
                        arr[counter] = line[0];
                    }
                    else {
                        end = line.find(",", end + 1);
                        arr[counter] = line[end + 1];
                    }

                    counter++;

                }
            }


            for (int i = 0; i < 10; i++) {
            cout << endl << "Here is the Char: " << arr[i] << endl;
        }







    return 0;
    }

Upvotes: 0

Slava
Slava

Reputation: 44258

If you want user to hit enter after each symbol, then code could be as simple as this:

char arr[10];
for(int i = 0; i < 10; )
{
    std::string line;
    std::getline( std::cin, line );
    // check that line is not empty
    if( line.empty() ) {
         std::cout << "missing input" << std::endl;
         continue;
    }
    arr[i++] = line[0]; // get only first symbol and ignore the rest
} 

if you have something else in mind, I am afraid that will not work with std::cin - you do not see any input until user presses enter. In that case you would have to use OS specific functions to get unbuffered input.

Upvotes: 0

NathanOliver
NathanOliver

Reputation: 180630

Most input is line feed so if you want to ignore all characters in the input stream until you hit a newline then you could use:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

Since we ignore up to the streamsize there should not be an extra content in the input buffer.

Upvotes: 1

Related Questions