我的程序中有一个类,它有一个成员变量、一个名为 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()
是一个类方法,你可以有一个私有(private)的 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
。如果需要调用C库函数,调用c_str()
传递合适的C库函数参数,这个C字符串就不用说了。
关于c++ - 无法成功返回我通过在字符串上调用 c_str() 创建的 const char*。 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38044998/