- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
Why does calling std::string.c_str() on a function that returns a string not work?
(3 个回答)
2年前关闭。
我是 C++ 编程新手(主要使用 Java),C++ 类、成员字符串和字符串转换为 const char*
的这种行为与 c_str()
让我很困惑。
我有一个标题,一个类和主要功能如下:
样本.h
class Sample
{
private:
int id;
std::string text;
public:
Sample(int id);
void setId(int id);
int getId();
void setText(std::string txt);
std::string getText();
void loadText();
~Sample();
}
Sample::Sample(int id)
{
this->id = id;
}
void Sample::setId(int id)
{
this->id = id;
}
int Sample::getId()
{
return this->id;
}
void Sample::setText(std::string txt)
{
this->text = txt;
}
std::string Sample::getText()
{
return this->text;
}
void Sample::loadText()
{
this->text = "Loaded";
}
Sample::~Sample()
{
std::cout << "Destructor is called." << std::endl;
}
void main()
{
int id = 1;
Sample* sample = new Sample(id);
// Case: 1 - If I do this, it does not work. Prints gibberish.
sample->loadText();
const char* text = sample->getText().c_str();
std::cout << text << std::endl;
// Case: 2 - Otherwise, this works.
sample->loadText();
std::cout << sample->getText().c_str() << std::endl;
// Case: 3 - Or, this works
sample->loadText();
std::string txtCpy = sample->getText();
const char* text = textCpy.c_str();
std::cout << text << std::endl;
}
const char*
的 C 库。但是,我无法弄清楚 Case: 1 和 Case: 3 之间的区别?如果我们返回字符串按值计算,将其复制到中间变量如何使其在运行时符合要求?
最佳答案
c_str()
的结果仅当您调用它的字符串仍然存在时才有效。在案例 3 中,txtCpy
在你写的时候仍然存在cout << text
.但在案例 1 中,字符串是 sample->getText
的返回值。这是暂时的,并且在该行的末尾停止存在。
如果您使用指向其他对象的指针或引用,此问题将始终存在。裸指针或引用有自己的生命周期,可能与目标对象的生命周期不同。这与 Java 中的对象引用都参与对象的生命周期不同。
因此,在使用这些功能时,您总是需要考虑对象的生命周期,通常建议改用更高级别的功能或其他不允许生命周期管理错误的代码样式。
您可以考虑向 Sample 添加一个成员函数,该函数会获得 const char *
指向原始字符串(尽管这是对封装的轻微违反,如果您按住指针然后修改底层字符串,仍然存在类似的问题)。最好完全避免使用裸指针。
关于c++ - C++ 字符串返回和 c_str() 强制转换的令人困惑的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60555228/
我正在尝试比较 libpqxx c_str值(value)观。 如果我尝试直接比较它们,result1[0][0].c_str() == result2[0][0].c_str(),例如,它们不会 r
const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. c_str()就是把string类对象转换成和c兼容的char *类型。
这个问题在这里已经有了答案: C++ strange behavior with string's c_str() function (2 个答案) 关闭 8 年前。 我得到了以下程序: std::
我想创建一个进程来读取一些串口。但是,用户将来应该能够更改程序所在的路径。这就是为什么我想包含变量 BasePathFile,它在类的初始化过程中设置为默认值: const std::string B
我的 C++ 标准草案拷贝(标记为“ISO/IEC JTC1 SC22 WG21 N3690Date: 2013-05-15") 对 basic_string::c_str() 和 basic_str
我知道 C++11 对 string 做了很多改变。其中最重要的是要求它在内存中线性布局。 在 C++11 之前,对 string::c_str 的调用将返回一个 const char*,但是否保证是
const char* getOutPath() { return classVarStr.c_str(); } 我有之前的功能, 当我收到返回值时有一些奇怪的东西, 我得到完整路径但不包括第一个
这个问题在这里已经有了答案: assigning string::c_str() to a const char* when the string goes out of scope (5 个答案)
如果使用 g++ 和 clang++,我得到 ++my string==my string##my string--。而MSVC和Intel Compiler,则是++==my string##my
我正在做一个 C++ 作业,需要用户输入一个表达式(例如:2 * (6-1) + 2 )并输出结果。除非在用户输入中遇到空格,否则一切正常。 需要将用户输入传递给以下方法; double Calcul
这个问题在这里已经有了答案: Why don't the std::fstream classes take a std::string? (10 个答案) 关闭 8 年前。 我正在阅读《C++ P
这是我在网上找到的一个小型图书馆: const char* GetHandStateBrief(const PostFlopState* state) { static std::ostrin
这个代码片段是正确的还是会导致未定义的行为? std::string s; assert(strlen(s.c_str())==0); 如果不是undefined behavior,上面的断言会通过吗
我已经用普通的 ifstreams 和我正在使用的当前 boost:iostream 尝试了以下代码,两者都有相同的结果。 它旨在将文件从 physfs 加载到内存中,然后将其传递给处理程序进行处理(
我有下面的代码片段。我期待输出将是 mystring,但奇怪的是它输出垃圾字符。 #include #include using namespace std; int main(int argc,
考虑以下函数: void f(const char* str); 假设我想使用 stringstream 生成一个字符串并将其传递给这个函数。如果我想在一个语句中做到这一点,我可能会尝试: f((st
我的理解是 c_str 将一个可能会或可能不会以 null 结尾的字符串转换为以 null 结尾的字符串。 这是真的吗?可以举一些例子吗? 最佳答案 c_str 返回一个 const char*,它指
有时我需要从 C 调用 C++ 对象。经过一些搜索,我知道我可以使用 extern "C" 来包装一些可以从 C 调用的接口(interface)。这是我的代码: #include #include
所以我有一个类 class MySuperClass { public: std::string buffer; }; 并希望将buffer打印到std::cout。 以下是有关从文件填充字符串的一
我从this answer知道字符串文字是静态分配的。但是下面的字符串连接也可以安全使用吗? void someFunction(std::string& foo) { functionTak
我是一名优秀的程序员,十分优秀!