Вопрос
В чем разница между ATOL () & STRTOL ()?
По словам их человеческих страниц, они, кажется, имеют тот же эффект, а также сопоставление аргументов:
long atol(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
В обобщенном случае, когда я не хочу использовать base
Аргумент (у меня просто десятичное число), какую функцию я должен использовать?
Решение
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
Может подходить только для очень простых и контролируемых случаев.
Другие советы
atol
Функциональность - это подмножество strtol
Функциональность, за исключением того, что atol
предоставляет вам не используемые возможности обработки ошибок. Самая заметная проблема с ato...
Функции состоит в том, что они приводят к неопределенному поведению в случае переполнения. Примечание: это не просто отсутствие информативных отзывов в случае ошибки, это неопределенное поведение, т.е. вообще ненаправленный неудача.
Это означает, что atol
функция (как и все остальные ato..
Функции) в значительной степени бесполезны для любых серьезных практических целей. Это была ошибка дизайна и ее место находится на джаунчатии истории С. Вы должны использовать функции из strto...
группа для выполнения преобразований. Они были введены, помимо прочего, чтобы исправить проблемы, присущие функциям ato...
группа.
Согласно atoi
Страница человека, она устарела strtol
.
IMPLEMENTATION NOTES
The atoi() and atoi_l() functions have been deprecated by strtol() and strtol_l()
and should not be used in new code.
В новом коде я всегда буду использовать strtol
. Отказ Это имеет ошибку обработки и endptr
Аргумент позволяет видеть, какая часть строки использовалась.
Стандартные состояния C99 о ato*
Функции:
За исключением поведения по ошибке, они эквивалентны
atoi: (int)strtol(nptr,(char **)NULL, 10)
atol: strtol(nptr,(char **)NULL, 10)
atoll: strtoll(nptr, (char **)NULL, 10)
atol(str)
эквивалентно
strtol(str, (char **)NULL, 10);
Используйте STRTOL, если вы хотите, чтобы конечный указатель (проверить, есть ли более символы для чтения или если на самом деле вы прочитали все вообще) или базу, отличную от 10. В противном случае ATOL отлично.
Если память служит, strtol()
имеет дополнительную выгоду для установки (необязательно) endptr
указывать на первый персонаж, который не может быть преобразован. Если NULL
, он игнорируется. Таким образом, если вы обрабатываете строку, содержащие цифры и символы, смешанные, вы можете продолжить.
например,
char buf[] = "213982 and the rest";
char *theRest;
long int num = strtol(buf, &theRest, 10);
printf("%ld\n", num); /* 213982 */
printf("%s\n", theRest); /* " and the rest" */
Страница мужчины Стрельс дает следующее:
ERRORS
EINVAL (not in C99) The given base contains an unsupported value.
ERANGE The resulting value was out of range.
The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).
Следующие проверки кода для ошибок диапазона. (Модифицированный код ELI немного)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
errno = 0;
char* end = 0;
long res = strtol("83459299999999999K997", &end, 10);
if(errno != 0)
{
printf("Conversion error, %s\n", strerror(errno));
}
else if (*end)
{
printf("Converted partially: %i, non-convertible part: %s\n", res, end);
}
else
{
printf("Converted successfully: %i\n", res);
}
return 0;
}