我读到atoi()
已被弃用,它等同于:
(int)strtol(token_start, (char **)NULL, 10);
这是否意味着我应该使用上述代替atoi(chr)
,还是仅仅说它们是等同的?
答案 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将不再可用。所以现在就开始更改代码