2012-04-23 107 views
0

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

这里是我的尝试:

strtol(str, &ptr, 10) 

其中ptrchar *str是一个字符串。现在,如果我在str传为'34EF',并打印*ptr,它正确地给我E*(ptr+1)给我F,但是如果我打印ptr,它给了我EF!不应印刷ptr只是导致像一个十六进制值的垃圾地址或什么?

回答

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

+0

只是一个注释:“一个包含5个字符串”更像是一个类比。打印功能将以'char *'给出的内存位置开始并打印,直至遇到NUL字符(0),该字符用于表示C字符串的结尾。 – nhahtdh 2012-06-25 08:08:06