どのように長い文字列のうち、符号なしを得るのですか?
-
18-09-2019 - |
質問
C ++で文字列からunsigned long型を取得するための最も安全で最良の方法は何でしょうか。
私は、可能なメソッドの数を知ってます。
まず、変換符号付き長いアトルから採取した。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
myStrに格納された値が含まれていることができ、長い署名よりも大きい場合にはこれで明白な問題は、何が起こるのか?アトルは何を取得していますか?
次の可能性は、strtoulをを使用することである。
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
しかし、これは少し私のニーズのための複雑な上にあります。私は簡単な関数、unsigned long型のベース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ライブラリ内の任意のもの?
私の謝罪これはだまされやすい人ですが、私は正確に鉱山にマッチしたすべての質問を見つけることができませんでした。
場合解決
これを行う1つの方法:
stringstream(str) >> ulongVariable;
他のヒント
あなたは問題なくstrtoulを使用することができます。この関数は符号なしlongを返します。正しい長い値が範囲外である場合convertionは、関数の戻り値0を実行できない場合、関数リターンULONG_MAXとのerrnoグローバル変数はERANGEに設定されている。
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);
あなたはブーストライブラリを使用することができる場合(www.boost.org)変換ライブラリを見て - それは、ヘッダのみを含んだ
#include "boost/lexical_cast.hpp"
そして、すべてを行う必要がある。
unsigned long ul = boost::lexical_cast<unsigned long>(str);
は、書き込みint型のパーサルーチンについて美しいポストを持っています(c)においてモノため。
これは、使用するコードは、オーバーフローのネイティブ型(あなたが32ビットを解析するために32ビットを必要とする)、およびエラー・コードを使用して生成します。
内蔵STD機能 "アトル" を使用します。
例STD ::文字列入力のため= "1024";
のstd ::アトル(input.c_str());
アトルは、タイプCの文字列であることへのパラメータなので、c_str()、それはあなたのためのことを行います期待しています。
堅牢な方法は次のようになります 静的な関数を記述し、それを使用する
bool str2Ulong(const string& str,unsigned long & arValue)
{
char *tempptr=NULL;
arValue=strtoul(str,tempptr,10);
return ! (arValue==0 && tempptr==str.c_str());
}