为什么stdlib.h中没有strtoi?
我已经习惯了strtod
和变体。 我想知道为什么stdlib.h没有strtoi。 为什么这个整数被排除在这个派对之外呢?
具体来说,我问为什么没有一个版本的atoi与strtod的安全function。
strtol()
将一个string转换为一个整数,然而一个长整数,但是一个整数。 有atoi()
但在大多数情况下应该避免,因为它没有一个机制,无效的input错误报告。
为什么stdlib.h中没有strtoi?
在C早期,没有一个标准符号types比long
更广泛,所有更窄的转换可以由strtol()
来完成 – 如下所示。
国际海事组织,这些和他们的unsigned
同行现在缺lessC函数和在当前标准C库中的devise缺陷。
在许多系统中, long
和int
具有相同的范围,所以减less了对单独strtoi()
。 atoi()
也满足快速和脏代码的需要,但是可能缺less错误检测。 也没有strto_short()
和strto_signchar()
等。
创build一个替代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's 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); }
改进灵感来自@chqrlie
整数不被排除在派对之外:有strtol
,它将一个string转换为一个整数types的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 atof(3), atoi(3), atol(3), strtol(3), strtoul(3)
你在找atoi(3)
。 🙂
这是电话atoi
。 有关详细信息,请参阅维基百科 ,包括其后继strol
。