我已经习惯了strtod和变种.我想知道为什么stdlib.h没有附带strtoi.为什么整数被排除在这个派对之外?
具体来说,我问为什么没有版本的atoi具有strtod的安全功能.
Wiz*_*Wiz 46
strtol()将字符串转换为整数,然后是一个长整数但是整数.有atoi(),但在大多数情况下可避免由于缺乏对错误的无效输入报告机制的事实.
chu*_*ica 23
为什么stdlib.h中没有strtoi?
没有迫切需要.
在早期的C中,没有标准的签名类型比long所有更窄的转换,例如int,可以从strtol()- 如下所述.
IMO,这些和他们的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'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);
}
#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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49605 次 |
| 最近记录: |