stringstream (또는 istringstream 또는 다른 Std-C++ 클래스)을 사용하여 숫자 (10 진수 및 16 진수)를 구문 분석하기위한 쉽고 세련된 방법을 찾고 있습니다.C++ : stringstream parsing
유효 숫자는 10 진수입니다. 11 일반적으로 내가 정규 표현식을 사용
BH 0xB로해야하지만가 없기 때문에 라이브러리와 데르의 C++ 컴파일러의 여기 수 없습니다.감사합니다!
stringstream (또는 istringstream 또는 다른 Std-C++ 클래스)을 사용하여 숫자 (10 진수 및 16 진수)를 구문 분석하기위한 쉽고 세련된 방법을 찾고 있습니다.C++ : stringstream parsing
유효 숫자는 10 진수입니다. 11 일반적으로 내가 정규 표현식을 사용
BH 0xB로해야하지만가 없기 때문에 라이브러리와 데르의 C++ 컴파일러의 여기 수 없습니다.감사합니다!
그것은 바보가 될 수 있지만 이럴 가장 간단한 해결책은 std::stringstream
+ std::hex
(및 others)입니다
unsigned int x;
std::stringstream ss;
ss << std::hex << "0xb";
ss >> x;
나는 복잡하다고 생각했습니다. – chris01
OP :'11 0xb bh '에 의해 정의 된 가능한 입력에 대해 일반적으로 작동하지 않습니다. 입력 '11'에 대해 x를 '17'으로 설정합니다. – zett42
@ zett42 내 코드는 16 진수 문자열의 예입니다. 제 생각에'11 0xb bh '는 3 개의 서로 다른 숫자 체계에서 단지 세 가지 가능한 입력이라고 생각합니다. 내가 게시 한 링크에는이 시스템을위한 조작기가 있습니다. 그리고 OP의 코멘트에서이 대답에 이르기까지 나는 그것이 그를 도왔다 고 결론을 내렸다. – stryku
내가 뭔가를 누락 될 수 있지만 기본 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
같은 부정적인 진수 숫자 std::out_of_range
예외 추락은이 std::stoul()
및 static_cast
이 int
에 결과를 보내고과 std::stoi()
을 대체하여 수정되었습니다.
어쩌면 [std :: strtol] (http://en.cppreference.com/w/cpp/string/byte/strtol)을보십시오 – Galik