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.
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
*p; if you don’t check
errno, you get
0 for empty input and
LONG_MIN for overflow or underflow. On empty input the return value is
errno might be set to
EINVAL; the portable way of checking for empty input is comparing
This will still accept strings that start with white space; check for
!isspace((unsigned char)*str) if you want to reject them.