Подтвердить что ты не робот

Почему нет strtoi в stdlib.h?

Я привык к strtod и вариантам. Мне интересно, почему нет strtoi, отправленного с stdlib.h. Почему это целое исключено из этой партии?

В частности, я спрашиваю, почему нет версии atoi с функциями безопасности strtod.

4b9b3361

Ответ 1

strtol() преобразует строку в целое число, но длинное целое число, но целое число. Существует atoi(), но его следует избегать в большинстве случаев из-за того, что ему не хватает механизма для сообщения об ошибках с недопустимого ввода.

Ответ 2

  Почему в stdlib.h нет strtoi?

Нет критической необходимости.

В раннем C не было стандартного знакового типа, более широкого, чем long, и все более узкие преобразования, такие как int, могли быть сделаны из strtol() - как это сделано ниже.

Похоже, в этих и их коллегах unsigned отсутствуют функции C и недостаток дизайна в текущей стандартной библиотеке C.


Во многих системах long и int имеют одинаковый диапазон, и поэтому существует необходимость в отдельном strtoi(). Также atoi() удовлетворяет потребность в быстром и грязном коде, но может не обнаруживать ошибки. Там также нет ни strto_short(), ни strto_signchar(), и т.д.

Довольно легко создать замену strtoi(). Упрощения существуют.

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

static long strto_subrange(const char *s, char **endptr, int base, 
    long min, long max) {
  long y = strtol(s, endptr, base);
  if (y > max) {
    errno = ERANGE;
    return max;
  }
  if (y < min) {
    errno = ERANGE;
    return min;
  }
  return y;
}

// OP goal
int strtoi(const char *s, char **endptr, int base) {
  #if INT_MAX == LONG_MAX && INT_MIN == LONG_MIN
    return (int) strtol(s, endptr, base);
  #else
    return (int) strto_subrange(s, endptr, base, INT_MIN, INT_MAX);
  #endif
}

short strtoshort(const char *s, char **endptr, int base) {
  return (short) strto_subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}

signed char strtoschar(const char *s, char **endptr, int base) {
  return (signed char) strto_subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}

#include <stdint.h>
int16_t strtoint16(const char *s, char **endptr, int base) {
  return (int16_t) strto_subrange(s, endptr, base, INT16_MIN, INT16_MAX);
}

Ответ 3

Целое число не осталось вне партии: существует strtol, который преобразует строку в long, которая является целым типом.

Ответ 4

Это то, что я использовал.

long long_val;
int  int_value;

errno = 0;
long_val = strtol (theString, NULL, 10);
if (errno)
   handle_error;
if ((long) someIntMin > long_val || long_val > (long) someIntMax)
   handle_invalid;
int_value = (int) long_val;

Ответ 5

Не забывайте раздел SEE ALSO ваших файлов:)

SEE ALSO
       atof(3), atoi(3), atol(3), strtol(3), strtoul(3)

Вы ищете atoi(3).:)

Ответ 6

Он вызывает atoi. Подробнее см. Wikipedia, включая его преемника strol.