转换为 std::string 并在一行中获取 const char *

Convert to std::string and get const char * in one line

我有一个号码需要转换为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) 立即超出范围或类似问题,因为它不用于直接初始化任何东西。

您需要的是一个 returns 和 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;
}

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.

创建一个字符串,其寿命至少与您要引用其内部数据的时间一样长。

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

只需使用 std::string 它可以完成您想要的一切,如果您不使用它则必须手动完成所有事情。

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

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