将 std::string 转换为 const char* 用于 printf 消耗
Convert std::string to const char* for printf Consumption
让我们考虑下面的代码示例。基本上,getMessage1
(内部(创建一个std::string
,该旨在返回,然后通过printf
打印。如何转换/转换/操作变量myString
,以使输出看起来像来自getMessage2
的输出?
我知道getMessage3
有效,但它要求我在每个printf
语句中包含.c_str()
(我想避免这个额外的后缀(。
#include <string>
const char* getMessage1() {
std::string myString = "SomeOutput";
return myString.c_str();
}
const char* getMessage2() {
return "SomeOutput";
}
std::string getMessage3() {
std::string myString = "SomeOutput";
return myString;
}
int main() {
printf("#1: %s n", getMessage1()); // prints #1: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠¿ⁿ9"w
printf("#2: %s n", getMessage2()); // prints #2: SomeOutput
printf("#3: %s n", getMessage3().c_str()); // prints #3: SomeOutput
return 0;
}
getMessage1 的问题在于,一旦你离开这个函数,就会删除它,给你悬空的指针。
最简单的解决方案是尽可能使myString静态,这样它的生命周期将与程序本身一样长。
const char* getMessage1() {
static std::string myString = "SomeOutput";
return myString.c_str();
}
int main() {
printf("#1: %s n", getMessage1()); // prints #1: SomeOutput
return 0;
}
链接到 ideone 上的工作示例
有关更多示例,请参阅如何返回局部变量的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 将 std::string 转换为 const char* 用于 printf 消耗
- 找到printf的意外错误,该格式为0.1F,用于四舍五入数字
- C++标准库是否有用于 printf 转换说明符的模板化 getter
- 如何将这些包装器用于 printf sprintf sprintf_s
- 为什么 c++ 字符串不适用于 scanf 和 printf
- C++:printf中间的分段错误,但仅适用于Ubuntu
- Python RE -正则表达式,用于匹配带有转义引号的类似printf格式字符串