Velvet Star Monitor

Standout celebrity highlights with iconic style.

updates

Good input validation loop using cin - C++

Writer Olivia Zamora

I'm in my second OOP class, and my first class was taught in C#, so I'm new to C++ and currently I am practicing input validation using cin. So here's my question:

Is this loop I constructed a pretty good way of validating input? Or is there a more common/accepted way of doing it?

Thanks!

Code:

int taxableIncome;
int error;
// input validation loop
do
{ error = 0; cout << "Please enter in your taxable income: "; cin >> taxableIncome; if (cin.fail()) { cout << "Please enter a valid integer" << endl; error = 1; cin.clear(); cin.ignore(80, '\n'); }
}while(error == 1);

4 Answers

I'm not a huge fan of turning on exceptions for iostreams. I/O errors aren't exceptional enough, in that errors are often very likely. I prefer only to use exceptions for less frequent error conditions.

The code isn't bad, but skipping 80 characters is a bit arbitrary, and the error variable isn't necessary if you fiddle with the loop (and should be bool if you keep it). You can put the read from cin directly into an if, which is perhaps more of a Perl idiom.

Here's my take:

int taxableIncome;
for (;;) { cout << "Please enter in your taxable income: "; if (cin >> taxableIncome) { break; } else { cout << "Please enter a valid integer" << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); }
}

Apart from only skipping 80 characters, these are only minor quibbles, and are more a matter of preferred style.

3
int taxableIncome;
string strInput = "";
cout << "Please enter in your taxable income:\n";
while (true)
{ getline(cin, strInput); // This code converts from string to number safely. stringstream myStream(strInput); if ( (myStream >> taxableIncome) ) break; cout << "Invalid input, please try again" << endl;
}

So you see I use string for input and then convert that to an integer. This way, someone could type enter, 'mickey mouse' or whatever and it will still respond.
Also #include <string> and <sstream>

One minor quibble is that the error helper variable is completely redundant and is not needed:

do
{ cin.clear(); cout << "Please enter in your taxable income: "; cin >> taxableIncome; if (cin.fail()) { cout << "Please enter a valid integer" << endl; cin.ignore(80, '\n'); }
}while(cin.fail());

Might you not consider try/catch, just to get you used to the concept of exception handling?

If not, why not use a boolean, instead of 0 and 1? Get into the habit of using variables of the correct type (and of creating types where needed)

Cin.fail() is also discussed at

In fact, in many places ...

you might study some of those and try to follow the explanations of why things should be done a certain way.

But, sooner or later, you ought to understand exceptions...

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy