无法成功返回我通过在字符串上调用 c_str() 创建的 const 字符*。(C++)

Can't successfully return a const char* I have created by calling c_str() on a string. (C++)

本文关键字:创建 str const C++ 字符 返回 成功 调用 字符串      更新时间:2023-10-16

我的程序中有一个类,它有一个成员变量,一个名为number的int,和一个成员函数getName(),它的意思是返回单词"Dice: #"作为一个const char*,但是#被存储在类中的数字所取代。

const char* getName(){
 return "Dice:";
}

工作得很好。

const char* getName(){
 std::stringstream ss;
 ss << number;
 std::string s;
 s = "Dice: " + ss.str();
 return s.c_str();
}

不能正常工作,并且返回看起来是垃圾的东西。我想不出做这件事的正确方法。如果我使用cout来打印s.c_str(),它会打印出我期望的内容。

简短而甜蜜的回答是,按照您设置的方式,您无法做到这一点。

从中检索c_str()std::string对象位于函数的局部作用域中。当函数返回时,std::string对象被销毁。

std::string s;

是一个局部函数对象。当函数返回时,它就不存在了。它加入了无形的唱诗班。它已不复存在。它是前对象

std::string对象被销毁时,它的任何c_str()对象都不再有效。这就是你得到垃圾:未定义行为的原因。

在某种程度上,如果不改变它的整体设计,就没有办法做到这一点。前进的道路有很多。一些可能性:

首先返回一个std::string

getName()返回std::string。无论调用它的人是谁,都可以暂时存储这个std::string,并在需要时获取它的c_str()

使用不同作用域的std::string

如果这个getName()是一个类方法,你可以有一个私有的std::string类成员,让getName()在那里存储字符串,并返回它的c_str()

因为原来的std::string仍然存在,所以返回的c_str()仍然有效。注意这里有一些陷阱。如果调用者再次调用getName(),先前返回的c_str()将不再有效。

结论

在你的c++代码中养成使用和使用std::string的习惯。这就是它们的作用。

名称"c_str()"应该是一个线索。它给你一个和C代码一起使用的字符串,如果附近有C代码的话。这是C弦。你在这里写C代码吗?不,你在写c++代码。

除非您正在编写C代码,或者正在与C库通信,否则首先不需要使用c_str()。如果你正在编写c++代码,你应该使用std::string s。如果您需要调用C库函数,请调用c_str()来传递适当的C库函数参数,并且不再使用此C字符串。

你正在创建一个局部变量's',然后返回一个指针到字符串内存中的字符串。

当函数返回时,字符串超出作用域(指针也超出作用域)

最好的办法可能是修改getname返回一个std::string,然后如果你需要使用c_str,在返回c_str的地方使用它。

std::string name = object.getName();
printf("name = %s", name.c_str());