将std :: string转换为const char *以获取printf消耗

时间:2018-08-08 11:16:12

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

让我们考虑下面的代码示例。基本上,getMessage1(内部)创建一个std::string,该printf可以返回然后通过myString打印。如何转换/广播/操作变量getMessage2,以使输出看起来像getMessage3中的变量?

我知道.c_str()是可行的,但是它要求我在每个printf语句中都包含#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; } (并且我想避免使用这个额外的后缀)。

if (role == Qt::BackgroundRole && isCategory(index)) {
    QBrush lightGrayColor(Qt::lightGray);
    return lightGrayColor;
}

1 个答案:

答案 0 :(得分:4)

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