In java, if I wanted to create some application which could receive both doubles and strings as appropriate input, I would probably do the following:
String input = getInput();//
try {
double foo = Double.valueOf(input);
//Do stuff with foo here
} catch (NumberFormatException e) {
//Do other validation with input
}
How would you go about doing that in c++? atof() returns 0.0 for invalid input, but how would you differentiate that from a valid double of “0.0”? As an aside, I can only include <iostream>, <string>, <cstdlib>, and <cassert> in this project. I’m assuming I need to use cin in some way, but how can you grab the original input after cin fails to parse some string as a double?
Edit: I could probably use the following, but as I said before, I’m not allowed to import <sstream> on this assignment for some reason
string input;
getline(cin, input);
double x;
istringstream foo(input);
foo >> x
if(cin){
//do manipulations with x
}
else{
//since it's not a number, check if input is a valid command etc..
}
Exceptions should be reserved for exceptional situations. While you certainly can abuse them like this, it’s a lousy idea — clearly you’re pretty much expecting things other than doubles, so treating it as an exception doesn’t make any real sense.
The only real question is the exact circumstance under which you want the input treated as a string. Just for example, if the input string was something like “1.23e2 non-numeric data”, do you want to just use the “1.23e2” as a number, or do you want to treat the whole thing as a string?
Either way, you’d want to us
strtodfor the conversion — the difference is only how you react to what it returns. In particular,strtodtakes two parameters instead of just one likeatofdoes. The second parameter is a pointer to pointer to char. Assuming you pass a non-NULL pointer,strtodwill set it to point at the last character in the input string that it successfully converted. If it’s pointing to the beginning of the input string, nothing was converted. If it’s pointing to the end, everything was converted. If it’s somewhere in between, part of the string converted, and part didn’t.For the moment, I’m going to assume that you want a double value holding whatever number could be converted at the beginning of the string, and whatever couldn’t be converted treated as a string: