views:

1331

answers:

4

Hi there,

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);
A: 

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 http://www.cplusplus.com/forum/beginner/2957/

In fact, in many places ...

http://www.google.com.sg/#hl=en&amp;source=hp&amp;q=c%2B%2B+tutorial&amp;btnG=Google+Search&amp;meta=&amp;aq=f&amp;oq=c%2B%2B+tutorial

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

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

Mawg
+2  A: 

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.

P-Nuts
Thanks, this is more along the lines of what I was looking for. Much appreciated. One question though, what is the for loop condition (;;)? Don't understand that.
Alex
@Alex - `foo(;;)` means loop forever, just like `while(1)`. If you don't want your loop to truly loop forever, you need a `break` somewhere inside to terminate the loop.
R Samuel Klatchko
A: 

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());
R Samuel Klatchko
A: 

if (cin >> taxableIncome)

Illegal Statement on VS2010. Instead try:

cin>>taxableIncome; if(cin.fail())...

Neal Amundsen