首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转换为std::string并在一行中获取const char *

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

Stack Overflow用户
提问于 2017-09-23 04:27:45
回答 4查看 1.2K关注 0票数 1

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

代码语言:javascript
运行
复制
int num = 5;
std::string s = std::to_string(5);
const char * p = s.c_str();

正如类似于?中的答案所建议的,但它涉及创建看似不必要的变量s,因此我尝试了以下操作,但它不起作用(p指向后面的空字符串):

代码语言:javascript
运行
复制
int num = 5;
const char * p = std::to_string(num).c_str();

我有办法做到这一点吗?为什么第二个例子不起作用?如果我犯了这个明显的错误,这种行为非常类似于发生了什么:

代码语言:javascript
运行
复制
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)问题立即超出了范围或类似的范围,因为它不用于直接初始化任何内容。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-23 04:38:51

std::string封装了动态内存管理(用new[]delete[]创建)。让我们把它拆开。

代码语言:javascript
运行
复制
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

创建一个字符串,只要您想要引用它的内部数据,该字符串就至少存在。

票数 4
EN

Stack Overflow用户

发布于 2017-09-23 04:43:14

只需使用std::string,它可以完成您想做的一切,如果不使用它,则需要手动执行的所有操作。

当您需要将const char*传递给const char*函数时,只需使用std::string::c_str(),如下所示:

代码语言:javascript
运行
复制
some_api_function(mystring.c_str()); // passes a const char*
票数 3
EN

Stack Overflow用户

发布于 2017-09-23 04:37:55

您需要的是一个函数,它返回一个保存您的值并可用于管理其生存期的char*。有问题的版本被破坏了,因为char*指向它不管理的内存。

例如:

代码语言:javascript
运行
复制
std::unique_ptr<char[]> str(int32_t x)
{
    std::unique_ptr<char[]> res(new char[12]);
    snprintf(res.get(), 12, "%d", x);
    return res;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46376043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档