2番目の議論はどのように機能しstrtol
ますか?
これが私が試したことです:
strtol(str, &ptr, 10)
ここptr
で、char *
はstr
文字列です。さて、として渡して印刷str
すると'34EF'
、*ptr
正しく表示され、出力されますが、印刷すると、16進アドレスなどのごみの値になるだけではいけませんか?E
*(ptr+1)
F
ptr
EF!
ptr
ptr
nullで終了する文字列の内部へのポインタです。したがって、"34EF"
それが文字を指していることに'E'
なり、そのアドレスで始まる文字列は"EF"
です。
のような4文字のC文字列には、p = "34EF"
実際には1つに5つの文字列が含まれています。文字列p
は"34EF"
です。文字列p+1
は"4EF"
; 文字列p+2
は"EF"
; p+3
は空の文字列"F"
です。この場合、。の後のヌルターミネータバイトを指します。p+4
""
p+4
F
空の文字列と言えば、への入力がstrtol
数値トークンを構成する有効な文字のみで構成されている場合はptr
、空の文字列を指す必要があります。
後続のジャンクを禁止したい場合は、これをテストできます。つまり、有効な数値が解析されても、*ptr
が0でない場合、入力の末尾にジャンクがあります。場合によっては、「ユーザーの皆様、10Zdfは数字ではありません。数字を入力してください!」ということを拒否することをお勧めします。