2009-10-31 3 views

답변

6
#include <sstream> 

// ... 

string str(*(treePtr->item.getInvest())); // assuming getInvest() returns ptr 
istringstream ss(str); 
int the_number; 
ss >> the_number; 
+0

네, 고맙습니다. –

+0

작동하지만 비효율적입니다. 적어도 하나의 힙 할당이 있고 거기에 자유가 있습니다. 프로그램이 멀티 스레드에 있으면 뮤텍스에 걸릴 수 있습니다. 한 번 또는 수백만 번 이렇게하고 있습니까? –

+0

wilhelmtell : 우리가 C++을 쓰고 있다고해서 모든 것이 클래스가되어야한다는 것을 의미하지는 않습니다. 조숙 한 최적화는 모든 악의 근원일지도 모르지만, 고의적으로 여분의 일을하는 것은 비뚤어집니다. –

3

strtol()을 사용하면 스트림을 어지럽게 사용하는 것이 좋습니다. 그것은 당신에게 반환 번호가 유효 여부의 표시를 제공하기 때문에

const char* s = treePtr->item.getInvest(); 
const char* pos; 
long the_number = ::strtol(s,&pos,10); 
if(pos!=s) 
    // the_number is valid 

strtol() 더 나은 선택이 될 것입니다. 또한 힙에 할당하지 않으므로 성능이 향상됩니다. 단순히 숫자를 원한다면 오류 대신 0을 받아 들여야한다. atol() (오류시 0을 반환하는 strtol 주위의 얇은 래퍼)을 사용하면된다.

+2

"strtol을 사용하는 것이 더 낫습니다"... 왜? –

+1

스트림은 "C++ 방식"입니다. C 문자열과 관련된 모든 세부 정보를 얻는 것에 대해 걱정하는 것이 더 좋습니다. – mch

+0

Shmoopty : 공정한 질문입니다. 나는 그 대답에 나의 추론을 덧붙였다. –

8

당신은 높일 수있는 액세스 권한이있는 경우 :

int number= boost::lexical_cast<int>(treePtr->item.getInvest());