What is the difference between atol() & strtol()?
According to their man pages, they seem to have the same effect as well as matching arguments:
long atol(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
In a generalized case, when I don't want to use the base
argument (I just have decimal numbers), which function should I use?
strtol
provides you with more flexibility, as it can actually tell you if the whole string was converted to an integer or not. atol
, when unable to convert the string to a number (like in atol("help")
), returns 0, which is indistinguishable from atol("0")
:
int main()
{
int res_help = atol("help");
int res_zero = atol("0");
printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
return 0;
}
Outputs:
Got from help: 0, from zero: 0
strtol
will specify, using its endptr
argument, where the conversion failed.
int main()
{
char* end;
int res_help = strtol("help", &end, 10);
if (!*end)
printf("Converted successfully\n");
else
printf("Conversion error, non-convertible part: %s", end);
return 0;
}
Outputs:
Conversion error, non-convertible part: help
Therefore, for any serious programming, I definitely recommend using strtol
. It's a bit more tricky to use but this has a good reason, as I explained above.
atol
may be suitable only for very simple and controlled cases.