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

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

本文关键字:一行 获取 const char std string 转换      更新时间:2023-10-16

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

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

如如何从int转换为char*的答案所建议的):

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封装了管理动态内存(使用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::c_str()这样的CC_23:

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

您需要的是返回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,并且不使用nessecary时不要使用const char*。他们基本上是同一回事。我仅在使用文件路径时才使用const char*。 到处使用std::string,您的程序应起作用。