문자열에서 서명되지 않은 방법은 어떻게 되나요?
-
18-09-2019 - |
문제
C ++의 문자열에서 서명되지 않은 오랫동안 검색하는 가장 안전하고 가장 좋은 방법은 무엇입니까?
나는 많은 가능한 방법을 알고 있습니다.
먼저, Atol에서 찍은 서명 된 오랫동안 변환.
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
이것에 대한 명백한 문제는 MySTR에 저장된 값이 서명 된 Long이 포함 할 수있는 것보다 클 때 어떻게됩니까? Atol은 무엇을 회수합니까?
다음 가능성은 strtoul을 사용하는 것입니다.
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
그러나 이것은 내 필요에 대해 약간 복잡합니다. 간단한 함수, 문자열, 서명되지 않은 긴베이스 10 아웃을 원합니다. 또한 오류 처리는 많은 것을 원합니다.
내가 찾은 마지막 가능성은 SSCANF를 사용하는 것입니다.
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
다시 한 번, 오류 처리는 원하는 것보다 훨씬 더 원하고 원하는 것보다 조금 더 복잡합니다.
나머지 명백한 옵션은 이전 가능성 중 하나에 래퍼를 작성하는 것입니다. 또는 문자열을 순환하고 ulong_max에 도달 할 때까지 각 숫자를 수동으로 변환하는 것입니다.
내 질문은 내 Google-FU가 찾지 못한 다른 옵션은 무엇입니까? C ++ STD 라이브러리에서 문자열을 서명되지 않은 긴 길로 깨끗하게 변환하고 실패에 대한 예외를 제외 할 수있는 것은 무엇입니까?
이것이 속임수라면 사과하지만, 나는 정확히 내 일치와 일치하는 질문을 찾을 수 없었습니다.
해결책
그것을하는 한 가지 방법 :
stringstream(str) >> ulongVariable;
다른 팁
문제없이 strtoul을 사용할 수 있습니다. 함수는 서명되지 않은 길이를 반환합니다. 변환을 수행 할 수없는 경우 함수는 0을 반환합니다. 올바른 긴 값이 범위를 벗어난 경우 함수는 ulong_max를 반환하고 Errno Global 변수가 eRange로 설정됩니다.
template <class T>
T strToNum(const std::string &inputString,
std::ios_base &(*f)(std::ios_base&) = std::dec)
{
T t;
std::istringstream stringStream(inputString);
if ((stringStream >> f >> t).fail())
{
throw runtime_error("Invalid conversion");
}
return t;
}
// Example usage
unsigned long ulongValue = strToNum<unsigned long>(strValue);
int intValue = strToNum<int>(strValue);
int intValueFromHex = strToNum<int>(strHexValue,std::hex);
unsigned long ulOctValue = strToNum<unsigned long>(strOctVal, std::oct);
Boost Libraries (www.boost.org)를 사용할 수 있다면 변환 라이브러리를보십시오.
#include "boost/lexical_cast.hpp"
그러면 당신이해야 할 일은
unsigned long ul = boost::lexical_cast<unsigned long>(str);
Jeffrey Stedfast는 아름다운 게시물을 가지고 있습니다 모노에 대한 파서 루틴을 작성하는 것에 대해 (C).
기본 유형을 사용하는 코드를 생성합니다 (32 비트를 구문 분석하는 데 32 비트가 필요함)와 오버 플로우의 오류 코드가 발생합니다.
"ATOL"내장 STD 기능을 사용하십시오
예를 들어 std :: string input = "1024";
std :: atol (input.c_str ());
Atol은 매개 변수가 C 형 문자열이 될 것으로 기대하므로 C_str ()는이를 수행합니다.
강력한 방법은 정적 기능을 작성하고 사용합니다.
bool str2Ulong(const string& str,unsigned long & arValue)
{
char *tempptr=NULL;
arValue=strtoul(str,tempptr,10);
return ! (arValue==0 && tempptr==str.c_str());
}