将指针字符串转换为整数
Posted
技术标签:
【中文标题】将指针字符串转换为整数【英文标题】:convert pointer string to integer 【发布时间】:2009-10-31 23:24:46 【问题描述】:我正在尝试将包含字符串的treePtr->item.getInvest()
转换为整数。这可能吗?
【问题讨论】:
***.com/questions/1243428/… 【参考方案1】:如果您有权使用 boost:
int number= boost::lexical_cast<int>(treePtr->item.getInvest());
【讨论】:
【参考方案2】:#include <sstream>
// ...
string str(*(treePtr->item.getInvest())); // assuming getInvest() returns ptr
istringstream ss(str);
int the_number;
ss >> the_number;
【讨论】:
它可以工作,但效率低下 - 至少有一个堆分配和空闲,如果你的程序在多线程中,它很可能会卡在互斥锁中。您是这样做一次还是数百万次? 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
的一个薄包装器,错误时返回零)。
【讨论】:
"最好使用 strtol" ... 为什么? 流是“C++ 方式”。我更喜欢它而不是担心正确获取与 C 字符串相关的所有细节。 Shmoopty:公平的问题。我已经在答案中添加了我的推理。 mch:流当然有自己的位置,但直接替代strtol()
并不是其中之一。就像当 const char*
就足够了时,您不会使用 std::string
。
这个答案+1。流有它们的位置,但效率非常低。你可以为 boost::lexical_cast以上是关于将指针字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章