stringstream(またはistringstreamやその他のStd-C++クラス)で数値(10進数と16進数)を解析するための、簡単で洗練された方法を探しています。C++:stringstream parsing
たとえば10進数の有効な入力。 11は、通常、私は正規表現を使用しますが、それが原因で不足しているライブラリのとC++コンパイラオーデルここでは可能ではない BH
0xb でなければなりません。
ありがとうございます!
stringstream(またはistringstreamやその他のStd-C++クラス)で数値(10進数と16進数)を解析するための、簡単で洗練された方法を探しています。C++:stringstream parsing
たとえば10進数の有効な入力。 11は、通常、私は正規表現を使用しますが、それが原因で不足しているライブラリのとC++コンパイラオーデルここでは可能ではない BH
0xb でなければなりません。
ありがとうございます!
それは愚かなことかもしれませんが、私見最も簡単な解決策はstd::stringstream
+ std::hex
(およびothers)である
unsigned int x;
std::stringstream ss;
ss << std::hex << "0xb";
ss >> x;
私は何かが欠落している可能性がありますが、私はデフォルトistream::operator >>
は、入力から自動的にベースを検出することができないと思われます。マニピュレータstd::hex
は、にのみ使用することができます。から16までは、接頭辞 "0x"または接尾辞 "h"に関係なくすべての入力に適用されます。
私たちは、カスタムタイプのためoperator >>
に過負荷をかけることで回避してstd::stoi()
を呼び出すことができます。
struct ParsedInt
{
int val;
};
inline std::istream& operator>>(std::istream& strm, ParsedInt& i)
{
std::string s; strm >> s;
i.val = 0;
if(! s.empty())
{
if(s.back() == 'h')
// explicitly use base 16 to parse hex
i.val = static_cast<int>(std::stoul(s, nullptr, 16));
else
// stoi() with base 0 will detect prefix "0x".
i.val = static_cast<int>(std::stoul(s, nullptr, 0));
}
return strm;
}
使用例:
int main()
{
std::stringstream ss("11 0xb bh -11 0xffffffff fffffffeh");
ParsedInt i;
while(ss >> i)
{
std::cout << i.val << "\n";
}
}
出力:
11
11
11
-11
-1
-2
編集:オリジナルのコードは0xFFFFFFFF
のような負の16進数のためのstd::out_of_range
の例外を除いて墜落した
、これはint
に結果をINGのstd::stoul()
とstatic_cast
でstd::stoi()
を交換することによって修正されました。
[std :: strtol](http://en.cppreference.com/w/cpp/string/byte/strtol) – Galik