7

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 ライブラリ内のものはありますか?

これがでたらめである場合は申し訳ありませんが、私の質問と完全に一致する質問は見つかりませんでした。

4

7 に答える 7

6

問題なく strtoul を使用できます。関数は unsigned long を返します。変換を実行できない場合、関数は 0 を返します。正しい long 値が範囲外の場合、関数は ULONG_MAX を返し、errno グローバル変数は ERANGE に設定されます。

于 2009-09-27T18:47:33.830 に答える
5

それを行う1つの方法:

stringstream(str) >> ulongVariable;
于 2009-09-27T18:41:12.103 に答える
4
template <class T>
T strToNum(const std::string &inputString,
           std::ios_base &(*f)(std::ios_base&) = std::dec)
{
    T t;
    std::istringstream stringStream(inputString);

    if ((stringStream >> f >> t).fail())
    {
        throw runtime_error("Invalid conversion");
    }
    return t;
}


// Example usage
unsigned long ulongValue = strToNum<unsigned long>(strValue);
int intValue             = strToNum<int>(strValue);

int intValueFromHex      = strToNum<int>(strHexValue,std::hex);
unsigned long ulOctValue = strToNum<unsigned long>(strOctVal, std::oct);
于 2009-09-27T18:47:34.430 に答える
2

Boostライブラリ(www.boost.org)を使用できる場合は、変換ライブラリを確認してください。これは、インクルードのみのヘッダーです。

#include "boost/lexical_cast.hpp"

その後、あなたがする必要があるのは

unsigned long ul = boost::lexical_cast<unsigned long>(str);
于 2009-09-27T18:55:27.940 に答える
1

Jeffrey Stedfast は、 Mono 用の int パーサー ルーチンの作成 (C 言語) に関する美しい投稿をしています。
ネイティブ型 (32 ビットを解析するには 32 ビットが必要) とオーバーフローのエラー コードを使用するコードを生成します。

于 2009-09-27T18:49:46.890 に答える
1

「atol」組み込み std 関数を使用する

たとえば、std::string input = "1024";

std::atol(input.c_str());

Atol は、パラメーターが c 文字列型であることを期待しているため、 c_str() がそれを行います。

于 2017-11-16T17:42:46.287 に答える
0

堅牢な方法は、静的関数を作成して使用することです

bool str2Ulong(const string& str,unsigned long & arValue)
{
   char *tempptr=NULL;
   arValue=strtoul(str,tempptr,10);

   return ! (arValue==0 && tempptr==str.c_str());

}
于 2009-09-28T06:03:14.583 に答える