Reputation:
I'm trying to setup an input checking loop so it continuously ask the user for a valid (integer) input, but it seems to get trapped in an infinite loop.
I've searched for solutions and tried to ignore()
and clear()
, but it still doesn't stop.
Could you please correct me where I'm wrong here?
int num;
cin >> num;
while (cin.fail()) {
cin.ignore();
cin.clear();
cout << "Enter valid number: " << endl;
cin >> num;
}
Upvotes: 2
Views: 1156
Reputation: 206607
When the stream is in an state of error,
cin.ignore();
does not do anything. You need to call cin.clear()
first before calling cin.ignore()
.
Also, cin.ignore()
will ignore just one character. To ignore a line of input, use:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Add
#include <limits>
to be able to use std::numeric_limits
.
The fixed up block of code will look something like:
int num;
while ( !(cin >> num) ) {
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "Enter valid number: " << endl;
}
Upvotes: 3
Reputation: 145279
The ignore()
has no effect when the stream is in fail state, so do the clear()
first.
Upvotes: 0