C++ で文字列から unsigned long を取得する最も安全で最良の方法は何ですか?
私はいくつかの可能な方法を知っています。
最初に、atol から取得した符号付き long を変換します。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
これに関する明らかな問題は、myStr に格納されている値が signed long に格納できる値よりも大きい場合にどうなるかということです。atol は何を取得しますか?
次の可能性は、strtoul を使用することです。
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
ただし、これは私のニーズに対して少し複雑です。シンプルな関数、文字列入力、符号なし long base 10 出力が欲しいです。また、エラー処理には多くの要望が残されています。
私が見つけた最後の可能性は、sscanf を使用することです。
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
繰り返しますが、エラー処理には多くの要望があり、私が望んでいるよりも少し複雑です。
残りの明らかなオプションは、以前の可能性のいずれかのラッパーを独自に作成するか、文字列を循環して ULONG_MAX に達するまで各桁を手動で変換するものを作成することです。
私の質問は、私の google-fu が見つけられなかった他のオプションは何ですか? 文字列を unsigned long にきれいに変換し、失敗時に例外をスローする C++ std ライブラリ内のものはありますか?
これがでたらめである場合は申し訳ありませんが、私の質問と完全に一致する質問は見つかりませんでした。