2017-03-16 115 views
1

我正在尋找一個簡單和優雅的方式來解析數字(十進制和十六進制)stringstream(或istringstream或一些其他的Std-C++類)。C++:stringstream解析

有效輸入的十進制數例如11應該是 0XB BH

通常我會使用一個正則表達式,但它是不可能的,因爲這裏缺少庫和奧得C++編譯器。

謝謝!

+0

也許看看[std :: strtol](http://en.cppreference.com/w/cpp/string/byte/strtol) – Galik

回答

2

這可能是愚蠢的,但恕我直言,最簡單的解決方法是std::stringstream + std::hex(和others

unsigned int x; 
std::stringstream ss; 
ss << std::hex << "0xb"; 
ss >> x; 
+0

我在想太複雜。 – chris01

+0

對於由OP定義的可能輸入,通常不起作用:'11 0xb bh'。它將輸入「11」的x設置爲「17」。 – zett42

+0

@ zett42我的代碼只是一個十六進制字符串的例子。我認爲'11 0xb bh'只是三種不同數字系統中的三種可能的輸入。在我發佈的鏈接中有這些系統的操縱器。從OP的評論到這個答案,我總結說它幫助了他 - 那就是目標。 – stryku

0

我可能失去了一些東西,但我認爲,默認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 

Live Demo

編輯:

原始代碼開車撞std::out_of_range例外像0xFFFFFFFF負進制數,這已得到修復與std::stoul()static_cast荷蘭國際集團的結果int更換std::stoi()