【问题标题】:Convert to std::string and get const char * in one line转换为 std::string 并在一行中获取 const char *
【发布时间】:2018-03-04 16:50:27
【问题描述】:

我有一个我需要转换为const char * 的数字(我正在使用它们的API 需要const char * 作为其许多函数的输入)。以下作品:

int num = 5;
std::string s = std::to_string(5);
const char * p = s.c_str();

正如how to convert from int to char*? 中的答案所建议的那样,但它涉及创建看似不必要的变量s,所以我尝试了以下方法,但它不起作用(p 之后指向一个空字符串):

int num = 5;
const char * p = std::to_string(num).c_str();

有没有一种干净的方法可以做到这一点?为什么第二个例子不起作用?如果我犯了这个明显的错误,这种行为与发生的情况非常相似:

const char * p;
{
    std::string tempStr( "hi" );
    p = tempStr.c_str( );
    // p points to "hi" string.
}
// now p points to "" string.

这让我怀疑问题 std::to_string(num) 立即超出范围或类似的东西,因为它不用于直接初始化任何东西。

【问题讨论】:

  • 为什么不直接使用std::string 而忘记const char*? (std::string 只是一个 char* 包裹在有用的代码中来做一些事情,所以你不需要)
  • 那个“看似不必要”的实例管理着p指向的动态分配的内存。在第二个示例中,该内存被立即释放,留下p 一个悬空指针。在第三个示例中相同,只是更明确一点。
  • @Galik 是的,我很乐意,但我使用的 API 需要 const char* 作为我经常使用的某些函数的输入。
  • 每次调用API 时只需传递s.c_str()(这就是它的用途)。
  • 变量s 不是必需的。需要确保创建的std::string 存在足够长的时间,以使其他代码(例如您正在使用的 API)可以安全地使用指向其内部的指针(例如 s.c_str() 返回的指针)。

标签: c++ string object-lifetime


【解决方案1】:

您需要的是一个返回 char* 的函数,该函数保存您的值并可用于管理其生命周期。有问题的版本已损坏,因为 char* 指向它无法管理的内存。

例如:

std::unique_ptr<char[]> str(int32_t x)
{
    std::unique_ptr<char[]> res(new char[12]);
    snprintf(res.get(), 12, "%d", x);
    return res;
}

【讨论】:

    【解决方案2】:

    std::string 封装了管理动态内存(使用new[]delete[] 创建)。让我们分解一下。

    const char * p = std::to_string(num).c_str();
    
    1. 创建一个std::string(具有num 的人类可读表示)。
    2. 获取分配给字符串的new[]ly const char*
    3. 将该值分配给p
    4. 销毁std::stringdelete[]分配的const char*
    5. p 指向...释放的数据

    如果您使用的是指针,则指针所指向的数据必须在该指针的整个生命周期内都存在

    所以,不,除了new[] 复制字符串之外别无他法,稍后您必须明确地delete[]。到那时,你已经把婴儿和浴缸一起扔了出去,不需要使用std::string

    创建一个至少与您想要引用其内部数据一样长的字符串。

    【讨论】:

      【解决方案3】:

      在任何地方都使用std::string,不要在非必要时使用const char*。它们基本上是一样的。我仅在使用文件路径时才使用const char*。 在任何地方使用std::string,您的程序应该可以运行。

      【讨论】:

      • using namespace STD 不仅是一个错字,它不适合在头文件中使用(在全局范围内)。不是一个好建议。
      • 对不起,约翰·塞尼先生。我想通了,我修好了。感谢您的反对票和电动 cmets。
      【解决方案4】:

      只需使用std::string,它就能完成您想做的所有事情,以及您在不使用它时必须手动完成的所有事情。

      当您需要将const char* 传递给const char* 函数时,只需像这样使用std::string::c_str()

      some_api_function(mystring.c_str()); // passes a const char*
      

      【讨论】:

        猜你喜欢
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2016-09-12
        相关资源
        最近更新 更多