我正在尋找一個簡單和優雅的方式來解析數字(十進制和十六進制)stringstream(或istringstream或一些其他的Std-C++類)。C++:stringstream解析
有效輸入的十進制數例如11應該是 0XB BH
通常我會使用一個正則表達式,但它是不可能的,因爲這裏缺少庫和奧得C++編譯器。
謝謝!
我正在尋找一個簡單和優雅的方式來解析數字(十進制和十六進制)stringstream(或istringstream或一些其他的Std-C++類)。C++:stringstream解析
有效輸入的十進制數例如11應該是 0XB BH
通常我會使用一個正則表達式,但它是不可能的,因爲這裏缺少庫和奧得C++編譯器。
謝謝!
這可能是愚蠢的,但恕我直言,最簡單的解決方法是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
編輯:
原始代碼開車撞std::out_of_range
例外像0xFFFFFFFF
負進制數,這已得到修復與std::stoul()
和static_cast
荷蘭國際集團的結果int
更換std::stoi()
。
也許看看[std :: strtol](http://en.cppreference.com/w/cpp/string/byte/strtol) – Galik