2012-04-23 150 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