为什么不应该使用atoi()函数?

15

有人告诉我不应该使用atoi()函数,而是应该始终使用strtol()函数。那么,为什么不能使用atoi()函数呢?strtol()确实是正确的替代品吗?(还有,strtol()返回的是一个long而不是像atoi()一样返回一个int,这个有什么影响吗?)


3
注意:我非常清楚为什么不要使用atoi()。然而,虽然我看到了一些关于如何使用atoi()的问题,这些问题解释了为什么不要使用它,但我还没有找到这个直接的问题,我觉得将问题和答案正确地链接在一起会很有用。 - This isn't my real name
1
(另外,我很好奇人们会想出什么答案。变化可能很有趣。) - This isn't my real name
4
是的,这个问题已经被讨论烂了。是的,我在网站上查看过了。我想要的是一个关于“为什么不应该使用atoi()”的问题,但我没有找到这样的问题。我发现很多关于如何使用atoi()的问题,基本上都被回答为“不要使用它,原因在这里”,但我认为为什么不使用atoi()这个问题值得另外提出来。由于这个问题现在被标记为我正在寻找但没有找到的那个问题的重复,我找到了我想要的,并且感到满意。 - This isn't my real name
3
这是一个好问题。关于“不要使用atoi,而要使用strtol”的人群中令人烦恼的另一件事是,如何正确使用strtol显然很难。到目前为止,这里的回答都没有解释这一点。我会尝试找到至少一个其他问题的链接,在那里可以找到答案。 - Steve Summit
3
这是一个好问题。“atoi”函数的问题在于它几乎没有定义良好的错误检测。即使使用“strtol”,正确地检测(和分类)错误仍然非常困难。这里的任何答案都没有解决这个问题。请参考这个问题中的答案,获取一些指导建议。 - Steve Summit
显示剩余2条评论
3个回答

29

从你自己的链接中:

atoi() 函数被 strtol() 函数所包含,但是由于它在现有代码中广泛使用而被保留。 如果不知道数字是否在范围内,应该使用 strtol(),因为 atoi() 不需要执行任何错误检查。

或者

atoi已经过时了


atoi比strtol更快吗? - ZeroPhase

7

使用atoi函数时,无法确定传递的字符串是否真的是一个数字,因为没有特殊的错误“返回”。它只处理十进制值(基数10),因此无法像strtol一样处理任意进制。此外,它也无法处理超过有符号整数的值(在大多数平台上为32位)。


5
如果字符串较大且无法转换,则会导致未定义的行为,因为该字符串的值可能太大而不在范围内。在这种情况下(其中数字的范围未知),应使用strtol()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接