Вопрос

В чем разница между 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top