2012-02-29 3 views
0

실제로 숫자와 문자열을 ,으로 분리 된 문자열 (예 : "12,fooBar")이 있습니다.문자열 (substr에서) 부호없는 int로 변환

숫자를 unsigned int myNum의 숫자와 std::string myStr의 숫자로 분리 된 변수에 넣고 싶습니다.

가 나는 코드의 잘린 다음 한 :

size_t pos1=value.find(','); 
std::cout << value.substr(0, pos1) << " and " 
      << (value.substr(0, pos1)).c_str() << std::endl; 

12 and 1을 얻을 수 있습니다. 내가 여기서 뭘 놓친 건 없니? 두 번째 부분의 2은 어떻게됩니까?

참고 : 나는이 코드를 잘랐다. unsigend int을 얻으려면 c_str()atoi으로 전달되어야합니다. 여기서는 두 번째 부분을 인쇄하고 싶지 않습니다.

업데이트 : 실제로 levelDB Get에서 문자열을 가져옵니다. 여기에 넣은 것처럼 테스트 문자열을 입력하면 작동합니다.

+0

당신이 거기에서해야 할 일은 있어야합니다. ([그것은 나를 위해 일한다] (http://ideone.com/NoB87).) * 문제를 보여주는 * * * * minimal * 프로그램을 제공해주십시오. http://sscce.org –

+0

@Rob 어떻게 작동합니까? 두 substrs 모두 동일한 초기 색인을 사용하고 있습니다. 그는 입력의 문자열 부분에 결코 도착하지 않습니다. – Sid

+1

@Sid이 스 니펫은 문자열 부분을 가져 오지 않습니다. 이 스 니펫 코드는'12와 12 '를 생성합니다. OP 노트를보십시오 : "atoi"에 전달하려면'c_str()'이 필요합니다. " –

답변

5

게시 된 코드는 동일한 하위 문자열 value.substr(0, pos1)을 생성합니다. std::string::substr()은 개체를 수정하지 않지만 새 std::string을 반환합니다.

예 :

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string value ="12,fooBar"; 
    unsigned int myNum; 
    std::string myStr; 

    const size_t pos1 = value.find(',');  
    if (std::string::npos != pos1) 
    { 
     myNum = atoi(value.substr(0, pos1).c_str()); 
     myStr = value.substr(pos1 + 1); 
    } 

    std::cout << myNum << " and " 
       << myStr << std::endl; 

    return 0; 
} 

출력 :

12 FOOBAR

편집 :

unsigned int 다음 다음이 작동에 필요한 유일한 부분 인 경우 :

로 5,
unsigned int myNum = atoi(value.c_str()); 

이 케이스 ,에, (- 또는 + 최고의 옵션 제외) 첫번째 숫자가 아닌 문자에서 중지됩니다.

+0

EDIT에 감사드립니다. 이것은 실제 문제를 지적했다. levelDB에서 얻은 문자열에는 atoi가 실패하게하는'' "과''2 '사이에''"가 있습니다. 힌트를 가져 주셔서 감사합니다. 내 문제에 대한 해결책은 아니지만 내 질문에 대한 답변) – ezdazuzena

0

는 두 번째 SUBSTR는 value.substr해야한다 (POS1 + 1, value.length는())

4

이 문제에 대한 깨끗한 C++ 스타일의 솔루션은 이제 stringstream을 사용하는 것입니다.

#include <sstream> 
// ... 
std::string value = "12,fooBar"; 
unsigned int myNum; 
std::string myStr; 
std::stringstream myStream(value); 
myStream >> myNum; 
myStream.ignore(); 
myStream >> myStr; 
+0

스트림을 사용하여 작업을 수행하는 것이 가장 좋습니다. 비록 내가 한 문장에서 그것을했을 뻔한 숯불 쉼표를 확인하기 위해 테스트. –

+0

쉼표를 확인하는 데 동의합니다. 모든 것을 한 줄에 넣고 싶습니다. 물론 예제를 편집하거나 최상의 편집 방법을 제안 할 수 있습니다. 다음과 같음 : 'char separator; myStream >> myNum >> separator >> myStr; if (separator == 'c') // ...' 그 의미는 무엇입니까? – Agentlien