将 std::string 转换为 const char* 用于 printf 消耗

Convert std::string to const char* for printf Consumption

本文关键字:用于 printf char 消耗 std string 转换 const      更新时间:2023-10-16

让我们考虑下面的代码示例。基本上,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 上的工作示例

有关更多示例,请参阅如何返回局部变量的指针。