2017-03-16 6 views
1

stringstream (또는 istringstream 또는 다른 Std-C++ 클래스)을 사용하여 숫자 (10 진수 및 16 진수)를 구문 분석하기위한 쉽고 세련된 방법을 찾고 있습니다.C++ : stringstream parsing

유효 숫자는 10 진수입니다. 11 일반적으로 내가 정규 표현식을 사용

BH 0xB로해야하지만가 없기 때문에 라이브러리와 데르의 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 내 코드는 16 진수 문자열의 예입니다. 제 생각에'11 0xb bh '는 3 개의 서로 다른 숫자 체계에서 단지 세 가지 가능한 입력이라고 생각합니다. 내가 게시 한 링크에는이 시스템을위한 조작기가 있습니다. 그리고 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.

편집 :

원래 코드가 0xFFFFFFFF 같은 부정적인 진수 숫자 std::out_of_range 예외 추락은이 std::stoul()static_castint에 결과를 보내고과 std::stoi()을 대체하여 수정되었습니다.