문제

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());

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top