Strtol 第二个参数

Posted

技术标签:

【中文标题】Strtol 第二个参数【英文标题】:Strtol second argument 【发布时间】:2012-04-23 23:24:28 【问题描述】:

strtol 的第二个参数是如何工作的?

这是我尝试过的:

strtol(str, &ptr, 10)

其中ptrchar *str 是一个字符串。现在,如果我将str 作为'34EF' 传递,并打印*ptr,它正确地给了我E,而*(ptr+1) 给了我F,但是如果我打印ptr,它给了我@ 987654333@ 不应该打印ptr 只会导致像十六进制地址之类的垃圾值吗?

【问题讨论】:

【参考方案1】:

ptr 是指向空终止字符串内部的指针。所以给定"34EF",它最终指向字符'E',从该地址开始的字符串是"EF"

p = "34EF" 这样的四字符C 字符串实际上包含五个字符串。字符串p"34EF"。字符串p+1"4EF";字符串p+2"EF"p+3"F"p+4 是空字符串 ""。在这种情况下,p+4 指向 F 之后的空终止符字节。

说到空字符串,如果strtol 的输入仅包含构成数字标记的有效字符,那么ptr 应该指向一个空字符串。

如果您想禁止尾随垃圾,您可以对此进行测试。也就是说,即使解析出一个有效数字,如果 *ptr 不是 0,那么输入有尾随垃圾。在某些情况下,最好拒绝:“尊敬的用户,10Zdf 不是数字;请输入数字!”

【讨论】:

不,这不是类比。实际上,那里实际上有五个字符串,由于共享一个共同的后缀,它们被压缩成一个小的存储空间。如果它是一个类比,我会加上它是一个类比的措辞。

以上是关于Strtol 第二个参数的主要内容,如果未能解决你的问题,请参考以下文章

strtol函数讲解

C函数strtol函数用法

make -k ,lsof及系统接口strtol

strtol、strtod 不安全吗?

c - 如何为 strtol 设置限制

如何确保 strtol() 已成功返回?