atol()v / s。strtol()


67

atol()和strtol()有什么区别?

根据他们的手册页,它们似乎具有相同的效果以及匹配的参数:

在一般情况下,当我不想使用base参数(我只有十进制数字)时,应该使用哪个函数?

c  strtol 

Answers:


92

strtol为您提供更大的灵活性,因为它实际上可以告诉您整个字符串是否已转换为整数。atol,如果无法将字符串转换为数字(如中的atol("help")),则返回0,该值与atol("0")

输出:

strtol将使用其endptr参数指定转换失败的位置。

输出:

因此,对于任何认真的编程,我绝对建议使用strtol。如前所述,使用起来有些棘手,但这有充分的理由。

atol 可能仅适用于非常简单且受控制的情况。


3
我相信在您的示例中,条件应为if (!*end)。它将指向字符串的null终止符(如果已将其全部转换),但本身不会设置为NULL。
杰夫·梅卡多

这个逻辑适用于Linux内核功能simple_strtol吗?if (!*end)使用您的确切模型,我无法获得评估为真的条件。
boltup_im_coding

4
这不能处理与数字超出范围有关的错误。为此,需要检查errno!
Shriram V

非常感谢你。我用字符串“ 123ABC”尝试了atol,它确实为我提供了123的值。所以您说的很对“对于任何认真的编程,我绝对建议使用strtol”。:)
someone_ smiley 2014年

需要注意的是POSIX 1003.1不能保证0被返回atol()错误的情况。Quote:如果无法表示该值,则行为未定义。
patryk.beza 2015年

22

atol功能是功能的子集strtol,除了atol没有为您提供可用的错误处理功能。ato...函数最突出的问题是,如果发生溢出,它们会导致未定义的行为。注意:这不仅是在发生错误时缺乏信息反馈,而且还是未定义的行为,即通常是无法恢复的故障。

这意味着该atol功能(以及所有其他ato..功能)对于任何严重的实际目的几乎是无用的。这是一个设计错误,它在C历史的垃圾场中。您应该使用strto...分组功能来执行转换。除其他外,它们被引入以纠正ato...小组职能中固有的问题。


19

根据atoi手册页,它已被弃用strtol


5

atol(str) 相当于

如果您要使用结束指针(以检查是否有更多字符要读取,或者实际上您是否已经读过任何字符)或除10以外的其他基数,请使用strtol。


4

在新代码中,我将始终使用strtol。它具有错误处理功能,该endptr参数使您可以查看使用了字符串的哪一部分。

C99标准声明了有关ato*功能:

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

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


2

如果有内存,则strtol()具有将(可选)设置endptr为指向无法转换的第一个字符的额外好处。如果为NULL,则将其忽略。这样,如果您要处理包含数字和字符混合的字符串,则可以继续。

例如,


1

strtol的手册页提供了以下内容:

以下代码检查范围错误。(对Eli的代码进行了一些修改)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.