strtol
的第二个参数如何工作?
以下是我的尝试:
strtol(str, &ptr, 10)
其中ptr
是char *
,str
是字符串。现在,如果我将str
作为'34EF'
传递,并打印*ptr
,则会正确地给我E
,而*(ptr+1)
会给我F
,但是,如果我打印ptr
,它会给我EF!
不应该打印ptr
只会导致像十六进制地址那样的垃圾值吗?
答案 0 :(得分:2)
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不是数字;请输入数字!”