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

标签 c++ string scope return lifetime

我的程序中有一个类,它有一个成员变量、一个名为 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/

相关文章:

c# - 为什么 null+false 与 null +"false"不同?

c# - 如果字符串在 .NET 中是不可变的,那么为什么 Substring 需要 O(n) 时间?

javascript - 在 Javascript 中制作数字表程序(如 12 x 1 = 12)时出现问题

c++ - 测量将参数传递给函数所需的时间

c++ - 如何使用 Softing 工具包从 OPC UA 服务器异步读取操作的回调中从 DataValue 响应中获取 NodeId 详细信息

c++ - winsock2发送和接收

c++ - opengl 3d 点云从 x,y,z 二维数组渲染

string - Scala StringLike split 方法为前导空格创建额外的双引号

javascript - 在 Javascript 中提取方法

javascript - Angular 种子范围问题