`strtol()` is what you get when you want to be flexible and yet have a simple interface.
At the first glance it looks like a nice, clean function: you pass it a string and a base and you get the value and optionally a pointer to the rest of the string.
Then you read the documentation.
To convert `const char *str` to a `long`, properly checking for overflow, invalid trailing characters and empty input, it is necessary to do the following:
> char *p;
errno = 0;
result = strtol(str, &p, base);
if (errno != 0 || *p != 0 || p == str)
error_handling ();
It is necessary to check both `errno` and `*p`; if you don't check `errno`, you get `0` for empty input and `LONG_MAX` or `LONG_MIN` for overflow or underflow. On empty input the return value is `0` and `errno` might be set to `EINVAL`; the portable way of checking for empty input is comparing `p` and `str`.
This will still accept strings that start with white space; check for `!isspace((unsigned char)*str)` if you want to reject them.
This was helpful in making a quick code with basic error handling..thank you!
ReplyDeleteNice post. I was checking constantly this blog and I am impressed! Very useful information particularly the last part :) I care for such information much. I was looking for this particular info for a very long time. Thank you and good luck.
ReplyDelete