Thomas Maeder wrote:
> Pep <[EMAIL PROTECTED]> writes: > > > I have numeric input which I must convert to strings and validate > > whilst doing the conversion. I do not want to mix C functions like > > strtol in to my c++ code, so I'm trying to implement a C++ method > > using examples found in google but none of them work :( > > std::strtol() is a Standard C++ function. Where's the problem? > > lol, sorry I was thinking of the likes of atol there, I had tried strtol but that did not work either, so I discounted it. <snip> Hmm, I was a bit scratchy with my cut & paste there :( Here's the real working code, followed by actual test results. I have removed the resetting of the istringstream as that is clearly a bug which is documented and there is a work around for it. I'm using g++ 3.4.6 on Debian GNU/Linux 4.0 r1 _Etch_ One point of note about the source is that you said I needed to include the <istream> and <ostream> headers but they are not needed in this code. The only header needed for the streams is the <sstream> header, so that is possibly an incompatibility between our compilers? #include <sstream> #include <iostream> #include <string> int main(int argc, char** argv) { long testLong; std::string testString; std::istringstream iss; iss.exceptions(std::istringstream::eofbit | std::istringstream::failbit | std::istringstream::badbit); iss.str(argv[1]); try // supposedly this will throw exception if conversion is non-numeric { iss >> testLong; } catch(std::istringstream::failure& e) { std::cout << "caught a exception geezer! [" << e.what() << "]" << std::endl; } if (!iss) // supposedly this is the way to check for invalid numeric input { std::cout << "conversion was illegal geezer!" << std::endl; } std::cout << "testLong [" << testLong << "]" << std::endl; return(EXIT_SUCCESS); } test results // test 12389 ./test 12389 caught a exception geezer! [basic_ios::clear] testLong [12389] NOTE: I do not expect this to throw an exception // test A12389 ./test A12389 caught a exception geezer! [basic_ios::clear] conversion was illegal geezer! testLong [-1210077196] NOTE: I expect this to throw an exception but how can I trust it as it is the same exception that was thrown in "test 12389", where I did not expect to throw an exception. // test 123A89 ./test 123A89 testLong [123] NOTE: well this certainly does not work how I expect it to :( //test 12389A ./test 12389A testLong [12389] NOTE: I am expecting to see both the exception error message and the illegal conversion error message here. In short I am expecting to see the exception and the illegal conversion error messages for all but the first test "test 12389". So what am I misunderstanding here? It is looking like I will have to write a function that iterates the string checking if each character is a digit before I use the istringstream or strtol to convert the string to a long because they do not seem to be able to validate the input themselves. Thanks for your help thus far, Pep. _______________________________________________ help-gplusplus mailing list help-gplusplus@gnu.org http://lists.gnu.org/mailman/listinfo/help-gplusplus