Strtol第二个论点

时间:2012-04-23 23:24:28

标签: c++ string parsing strtol

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

以下是我的尝试:

strtol(str, &ptr, 10)

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

1 个答案:

答案 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不是数字;请输入数字!”