user6417553
user6417553

Reputation:

std::cin loops even if I call ignore() and clear()

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

Answers (2)

R Sahu
R Sahu

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

Cheers and hth. - Alf
Cheers and hth. - Alf

Reputation: 145279

The ignore() has no effect when the stream is in fail state, so do the clear() first.

Upvotes: 0

Related Questions