что эквивалентно atoi или strtoul для uint32_t и других типов stdint? - PullRequest
6 голосов
/ 21 апреля 2011

Я ищу стандартные функции для преобразования строки в stdint.h целое число, например

int i = atoi("123");
unsigned long ul = strtoul("123", NULL, 10);
uint32_t n = mysteryfunction("123"); // <-- ???

Ответы [ 2 ]

8 голосов
/ 21 апреля 2011

Существует два основных параметра: strto[iu]max, за которыми следует проверка, подходит ли значение для меньшего типа, или переключение на sscanf.Стандарт C определяет все семейство макросов в <inttypes.h>, которые расширяются до соответствующего спецификатора преобразования для типов <stdint.h>.Пример для uint32_t:

#include <inttypes.h>
#include <stdio.h>

int main()
{
    uint32_t n;

    sscanf("123", "%"SCNu32, &n);
    printf("%"PRIu32"\n", n);

    return 0;
}

(В случае uint32_t проверка переполнения strtoul + также будет работать для uint32_t, поскольку unsigned long имеет ширину не менее 32 бит.не надежно работает для uint_least32_t, uint_fast32_t, uint64_t и т.* в том, что вы не можете указать базу.Однако базу 8 и базу 16 все еще можно получить с SCNo32 и SCNx32, соответственно.

1 голос
/ 22 апреля 2011

Поскольку ваш вопрос касается unsigned целых чисел, проверка переполнения проста. С небольшой вспомогательной функцией

inline
unsigned long long
strtoullMax(const char *nptr,
            char **endptr,
            int base,
            unsigned long long maxval) {
  unsigned long long ret = strtoll(nptr, endptr, base);
  if (ret > maxval) {
     ret = maxval;
     errrno = ERANGE;
  } else {
     if (ret == ULLONG_MAX && errno == ERANGE)
        ret = maxval;
  }
  return ret;
}

вы легко можете определить макросы, которые делают трюк для любого интересующего вас типа

#define strtou32(NPTR, ENDPTR, BASE)                  \
   strtoullMax(NPTR, ENDPTR, BASE, (uint32_t)-1)
#define strtou32f(NPTR, ENDPTR, BASE)                 \
   strtoullMax(NPTR, ENDPTR, BASE, (uint_fast32_t)-1)
#define strtou32l(NPTR, ENDPTR, BASE)                 \
   strtoullMax(NPTR, ENDPTR, BASE, (uint_least32_t)-1)
...