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.
if (!*end)
. It will be pointing to the null-terminator of the string (if it was all converted) but won't be set to NULL itself. – Reremouse