无法成功返回我通过在字符串上调用 c_str() 创建的 const 字符*。(C++)
Can't successfully return a const char* I have created by calling c_str() on a string. (C++)
我的程序中有一个类,它有一个成员变量,一个名为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());
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 超级级别的方法称为super具有sub的str attr 实例在循环 实例中创建的方法是作为super的指针存储在向