Re: getting rid of unwanted characters in the input
On Aug 10, 9:11 am, Jorgen Grahn <grahn+n...@snipabacken.se> wrote:
On Mon, 2010-08-09, Francesco S. Carta wrote:
subramanian10...@yahoo.com, India <subramanian10...@yahoo.com>, on
09/08/2010 07:16:19, wrote:
[...]
string str;
getline(cin, str);
I would do that too, but then I'd feed that line to strtol() or one of
its cousins, and use its mechanisms to make sure the line was just
whitespace and an integer, short enough not to overflow an int.
Probably I would have to do other checks too to do stuff like accepting
trailing whitespace.
You mean something like:
static boost::regex const isInt( "\\s*[+-]?\\d+\\s*" );
if ( !regex_match( line, isInt ) ) {
std::cerr << "I wanted an integer" << std::endl;
} else {
std::istringstream toParse( line ):
int i;
toParse >> i;
// ...
}
In this case, it's almost as easy to parse directly:
std::istringstream toParse( line );
int i;
toParse >> i >> std::ws;
if ( !toParse || toParse.get() != EOF )
std::cerr << "I wanted an integer" << std::endl;
} else {
// ...
}
But the regex solution will often be a lot simpler than testing
a lot of different error conditions.
[...]
For an example that would be OK I guess, but in general
I don't like programs which silently discard input they don't
understand.
I agree, but having found and reported an error, you still have
to discard the rest of the line if you want to advance.
(Few non-example programs these days have "enter an integer"
prompts these days. Most have at least command-line editing,
history ...)
Something similar is often required to parse command line
arguments. Or lines in a configuration file. Or any number of
other outputs. (About the only program I've ever seen that
asked for input like the above---and that goes back a long, long
way---was the old Unix units: "You have?", "You want?".)
--
James Kanze