Я привык к strtod
и вариантам.
Мне интересно, почему нет strtoi, отправленного с stdlib.h.
Почему это целое исключено из этой партии?
В частности, я спрашиваю, почему нет версии atoi с функциями безопасности strtod.
Я привык к strtod
и вариантам.
Мне интересно, почему нет strtoi, отправленного с stdlib.h.
Почему это целое исключено из этой партии?
В частности, я спрашиваю, почему нет версии atoi с функциями безопасности strtod.
strtol()
преобразует строку в целое число, но длинное целое число, но целое число. Существует atoi()
, но его следует избегать в большинстве случаев из-за того, что ему не хватает механизма для сообщения об ошибках с недопустимого ввода.
Почему в 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);
}
Целое число не осталось вне партии: существует strtol
, который преобразует строку в long
, которая является целым типом.
Это то, что я использовал.
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;
Не забывайте раздел SEE ALSO
ваших файлов:)
SEE ALSO atof(3), atoi(3), atol(3), strtol(3), strtoul(3)
Вы ищете atoi(3)
.:)
Он вызывает atoi
. Подробнее см. Wikipedia, включая его преемника strol
.