繁体   English   中英

为什么 stdlib.h 中没有 strtoi?

[英]Why is there no strtoi in stdlib.h?

我已经习惯了strtod和变体。 我想知道为什么<stdlib.h>没有附带strtoi 为什么 integer 类型被排除在此方之外?

具体来说,我问为什么没有具有strtod安全功能的atoi版本?

strtol()将字符串转换为 integer、长 integer 但仍然是 integer。 atoi()但在大多数情况下应该避免使用它,因为它缺乏从无效输入报告错误的机制。

为什么 stdlib.h 中没有 strtoi?

没有关键需求。

在早期的 C 中,没有标准签名的 integer 类型比long更宽,所有更窄的转换,如int ,都可以从strtol()进行 - 如下所示。

IMO,这些及其unsigned的对应物现在缺少 C 功能和当前标准 C 库 (C17/18) 中的设计缺陷。


在许多系统上, longint具有相同的范围,因此减少了对单独strtoi()的需求。 atoi()满足了将快速和脏代码转换为int的需求,但可能缺乏错误检测或导致未定义行为(UB)。 也没有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);
}

integer 并没有被排除在外:有strtol ,它将字符串转换为long ,它是 integer 类型。

这是我一直在使用的。

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;

它叫atoi 另请参阅Wikipedia了解详细信息,包括其继任者strol

不要忽略手册页的SEE ALSO部分:)

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

您正在寻找atoi(3) :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM