How to make cin take only numbers

When cin encounters an input it can’t properly read in to the variable specified (such as inputing a character into an integer variable), it goes into an error state and leaves the input in it’s buffer.

You have to do several things to properly handle this scenario.

  1. You have to test for this error state.
  2. You have to clear the error state.
  3. You have to either alternatively handle the input data that generated the error state, or flush it out and reprompt the user.

The following code provides one of numerous methods of doing these three things.

#include<iostream>
#include<limits>
using namespace std;
int main()
{

    cout << "Enter an int: ";
    int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;        
}

You could just pass in some large value to cin.ignore like 1000 and it’s likely to behave exactly the same for all practical purposes.

You can also test cin after the input attempt and handle it that way, something like
if(!cin){//clean up the error} .

Check out the istream reference for other member functions to handle stream state: http://cplusplus.com/reference/iostream/istream/

Leave a Comment