【问题标题】:Convert std::string to const char* for printf Consumption将 std::string 转换为 const char* 以供 printf 使用
【发布时间】:2018-08-08 11:16:12
【问题描述】:

让我们考虑下面的代码示例。基本上,getMessage1(内部)创建了一个std::string,该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;
}

【问题讨论】:

  • 请问你为什么不选择cout
  • getMessage1 具有未定义的行为,您正在返回一个指向字符串数据的指针,但函数结束时它将无法生存。
  • @Aziuth 因为我通常会像%19s 这样来对齐输出。如果cout 可以做到这一点,我很乐意改变它。
  • @Borgleader 啊,很好。与cout 相比,printf 是否存在普遍的反感?

标签: c++ string c++11 printing printf


【解决方案1】:

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;
}

Link to working example on ideone

更多示例请参见how to return pointer of local variable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2016-09-12
    • 2014-01-09
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多