70

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

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

4

6 回答 6

50

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

于 2011-05-30T23:09:18.570 回答
39

为什么 stdlib.h 中没有 strtoi?

没有关键需求。

在早期的 C 中,没有标准的有符号整数类型比宽long,所有更窄的转换,如int,都可以由strtol()- 进行,如下所示。

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


在许多系统上,long并且int具有相同的范围,因此减少了对单独strtoi(). atoi()满足快速和脏代码转换为的需求int,但可能缺乏错误检测。出错时,atoi()会引发未定义的行为(UB)。也没有strto_short()norstrto_signchar()等。

创建替代品相当容易strtoi()。存在简化。

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

static long str2subrange(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 str2i(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) str2subrange(s, endptr, base, INT_MIN, INT_MAX);
  #endif
}

short str2short(const char *s, char **endptr, int base) {
  return (short) str2subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}

signed char str2schar(const char *s, char **endptr, int base) {
  return (signed char) str2subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}

#include <stdint.h>
int16_t str2int16(const char *s, char **endptr, int base) {
  return (int16_t) str2subrange(s, endptr, base, INT16_MIN, INT16_MAX);
}

[编辑 2021]

为避免与未来库方向冲突,名称从 更改strto...()str2...()
2暗示to

str以、mem或和小写字母开头的函数名称wcs可以添加到<string.h>标头中的声明中。C17dr § 7.31.13 1

于 2015-03-31T20:54:39.687 回答
3

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

于 2011-05-30T23:01:31.780 回答
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;
于 2013-09-08T20:02:15.347 回答
-4

是通话atoi。另请参阅Wikipedia了解详细信息,包括其继任者strol

于 2011-05-30T22:59:49.793 回答
-4

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

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

你正在寻找atoi(3). :)

于 2011-05-30T23:01:47.333 回答