strtol
предоставляет вам больше гибкости, поскольку фактически может сказать вам, была ли целая строка преобразована в целое число или нет. atol
, если не удается преобразовать строку в число (как в atol("help")
), возвращает 0, что неотличимо от 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;
}
Выходы:
Got from help: 0, from zero: 0
strtol
будет указывать, используя аргумент endptr
, где преобразование не удалось.
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;
}
Выходы:
Conversion error, non-convertible part: help
Поэтому для любого серьезного программирования я определенно рекомендую использовать strtol
. Это немного сложнее в использовании, но для этого есть веская причина, как я объяснил выше.
atol
может подойти только для очень простых и контролируемых случаев.