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() является лучшим выбором, поскольку он дает представление о том число, возвращаемое является действительным или нет. Кроме того, он избегает выделения на кучу, поэтому он будет работать лучше. Если вам просто нужен номер, и вы с радостью принимаете нуль вместо ошибки, просто используйте atol() (это всего лишь тонкая обертка вокруг strtol, которая возвращает нуль при ошибке).

+2

«Лучше использовать strtol» ... почему? –

+1

Потоки - это «путь на С ++». Я предпочитаю, чтобы он беспокоился о том, чтобы все детали, связанные с строками C, были правильными. – mch

+0

Shmoopty: справедливый вопрос. Я добавил свои аргументы в ответ. –

8

если у вас есть доступ к Форсирование:

int number= boost::lexical_cast<int>(treePtr->item.getInvest()); 
Смежные вопросы