atoi() - 字符串到int

时间:2009-09-28 18:23:56

标签: c

我读到atoi()已被弃用,它等同于:

(int)strtol(token_start, (char **)NULL, 10);

这是否意味着我应该使用上述代替atoi(chr),还是仅仅说它们是等同的?

5 个答案:

答案 0 :(得分:12)

atoi未被弃用,您的来源不正确。当前的C标准ISO 9899:2011中没有任何内容表明这一点(例如参见第6.11章未来语言方向),也没有早期标准中的任何内容。

根据C标准,atoi相当于strtol如下,C11 7.22.1.2:

  

atoi,atol和atoll函数转换了初始部分   nptr指向int,long int和long long int的字符串   代表,分别。

     

除了出错的行为外,它们等同于

     

atoi: (int)strtol(nptr, (char **)NULL, 10)

     

atol: strtol(nptr, (char **)NULL, 10)

     

atoll: strtoll(nptr, (char **)NULL, 10)

首选strtol,因为atoi在出错时调用未定义的行为。见7.22.1"如果无法表示结果的值,则为 行为未定义。"

答案 1 :(得分:10)

它确实在Apple的Mac OS X Manual Page for atoi(3)(以及BSD手册页)中说atoi已被弃用。

  

atoi()函数已被strtol()弃用,不应该   用于新代码。

我会因为这个原因使用strtol()等价物,但我怀疑你必须担心atoi()被删除。

<击> 来自http://www.codecogs.com/library/computing/c/stdlib.h/atoi.php 实施说明

* The atoi function is not thread-safe and also not async-cancel safe.
* The atoi function has been deprecated by strtol and should not be used in new code.

<击>

答案 2 :(得分:4)

description of atoi()strtol()的相似性/差异有一个非常重要的意义

> ... The call atoi(str) shall be equivalent to:
> (int) strtol(str, (char **)NULL, 10)
> except that the handling of errors may differ.

试试这个很有趣:

const char *buf = "forty two";
int t1 = atoi(buf);             /* detect errors? */
int t2 = strtol(buf, NULL, 10); /* detect errors? */

答案 3 :(得分:2)

不,你不应该使用上述代替atoi

您应该检查strtol提供的错误信息:

i = atoi(s);

应替换为

char* stopped;
i = (int)strtol(s, &stopped, 10);
if (*stopped) { /* handle error */ }

答案 4 :(得分:-2)

这意味着在某个时间点atoi将不再可用。所以现在就开始更改代码