转换为 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();
- 创建一个
std::string
(具有 num
的人类可读表示)。
- 获取
new[]
ly分配给const char*
的字符串。
- 将该值分配给
p
。
- 销毁
std::string
→delete[]
分配const char*
.
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*
我有一个号码需要转换为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();
- 创建一个
std::string
(具有num
的人类可读表示)。 - 获取
new[]
ly分配给const char*
的字符串。 - 将该值分配给
p
。 - 销毁
std::string
→delete[]
分配const char*
. 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*