0
strtol
的第二个参数如何工作?Strtol第二个参数
这里是我的尝试:
strtol(str, &ptr, 10)
其中ptr
是char *
和str
是一个字符串。现在,如果我在str
传为'34EF'
,并打印*ptr
,它正确地给我E
和*(ptr+1)
给我F
,但是如果我打印ptr
,它给了我EF!
不应印刷ptr
只是导致像一个十六进制值的垃圾地址或什么?
strtol
的第二个参数如何工作?Strtol第二个参数
这里是我的尝试:
strtol(str, &ptr, 10)
其中ptr
是char *
和str
是一个字符串。现在,如果我在str
传为'34EF'
,并打印*ptr
,它正确地给我E
和*(ptr+1)
给我F
,但是如果我打印ptr
,它给了我EF!
不应印刷ptr
只是导致像一个十六进制值的垃圾地址或什么?
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不是数字,请输入数字!”
只是一个注释:“一个包含5个字符串”更像是一个类比。打印功能将以'char *'给出的内存位置开始并打印,直至遇到NUL字符(0),该字符用于表示C字符串的结尾。 – nhahtdh 2012-06-25 08:08:06