为什么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缺陷。


在许多系统中, longint具有相同的范围,所以减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