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