为什么stdlib.h中没有strtoi?

时间:2011-05-30 22:58:19

标签: c std strtod

我已经习惯了strtod和变体。 我想知道为什么stdlib.h没有附带strtoi。 为什么整数被排除在这一方之外呢?

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

6 个答案:

答案 0 :(得分:46)

strtol()将字符串转换为整数,但长整数却是整数。有atoi()但在大多数情况下应避免使用它,因为它缺少无效输入的错误报告机制。

答案 1 :(得分:21)

  

为什么stdlib.h中没有strtoi?

没有迫切需要。

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

IMO,这些及其unsigned对应者现在缺少C函数和当前标准C库中的设计缺点。


在许多系统上,longint具有相同的范围,因此减少了对单独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);
}

答案 2 :(得分:5)

整数不会被排除在聚会之外:有strtol,它将字符串转换为long,这是一个整数类型。

答案 3 :(得分:2)

这就是我一直在使用的。

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;

答案 4 :(得分:-2)

请勿忽略您的联机帮助页的SEE ALSO部分:)

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

您正在寻找atoi(3)。 :)

答案 5 :(得分:-3)

致电atoi。另请参阅Wikipedia了解详细信息,包括其后续版strol