【问题标题】:convert pointer string to integer将指针字符串转换为整数
【发布时间】:2009-10-31 23:24:46
【问题描述】:

我正在尝试将包含字符串的treePtr->item.getInvest() 转换为整数。这可能吗?

【问题讨论】:

标签: c++ string integer pointers


【解决方案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 使用 strtol 做一个模板特化
    猜你喜欢
    • 2013-03-06
    • 2011-12-12
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多