How-To: Get valid integer input in C++ (a stupidly long solution to a stupidly simple problem)

Update: See the comments for a far, far more elegent and robust solution courtesy of the mighty shetboy!


One of the assessments I’ve got my diploma class doing at the moment is to fix all the bugs in some deliberately shonky C++ code. The code just asks for a name (string) and an age in years (int), and it then multiplies the age in years by 365 to give a rough indication of how many days you’ve been alive. So for example if I enter Al and 34 it comes back with:

Hi, Al! You’ve been alive for roughly 12410 days!

The problems come thick and fast though if you want to verify that the age in years entered is really an integer value. You CAN do so like this:

But you then end up with output like this where each character fails individually:

Obviously that’s no good, so I researched a bit and came up with a solution but –DAMN– it doesn’t feel like the right one… Check out all this clumsiness:

That works perfectly well as far as I’m concerned (remember – I’m not trying to validate the int to be within a given range or anything – I just want a valid int!) but something is surely wrong here… this should be a one-liner, or maybe three or four lines at the absolute most, not 140 lines or so…

Anyone got any suggestions on how to do this the right way? (In C++ not C, so no atoi or C-strings, and no boost library please! Just “standard” C++!).

Cryptic error message of the day

I love Linux, but sometimes you have to wonder just what was going through the minds of some of the developers. Take, for example the following error message that appeared when I (for all intents and purposes) clicked on my DVD drive:

Linux Error Messages Suck

Can you figure out what the problem was? No? Neither could I. And then I looked at the DVD drive, which was open…

Ah.

Error messages should be expressed in plain language (no codes), precisely indicate the problem, and constructively suggest a solution – and I can see that it’s trying (it’s trying real hard) – but I really still would have preferred “No disc in drive. Please insert a disc.”