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