【问题标题】:What's the difference between putting std::string and std::string::c_str() into a stringstream?将 std::string 和 std::string::c_str() 放入字符串流有什么区别?
【发布时间】:2011-11-04 15:42:07
【问题描述】:

我们看到了一个奇怪的场景,基本上可以归结为以下几点:

std::string something = "someval";
std::stringstream s;

s << something;
std::cout << s.str();

不等于:

std::string something = "someval";
std::stringstream s;

s << something.c_str();
std::cout << s.str();

更进一步——无论哪种情况,输出都不是乱码。发生的情况是案例 1 的输出似乎映射到系统中的另一个(有效)字符串,而案例 2 的输出是预期的。

我们通过简单的改变就能看到这种行为:

s << something;

收件人:

s << something.c_str();

我知道这听起来很疯狂(或者对我来说确实如此),而且我无法将它复制到更大的系统之外 - 很抱歉没有“工作”示例。但是有谁知道这种事情怎么会发生?我们可以在某处踩内存或对某个位置的字符串表或其他类似的东西做某事吗?

【问题讨论】:

  • 贴出真实的代码来显示差异!
  • 实际代码中的 something 字符串是否包含嵌入的 nul 字符?
  • 如果您正在破坏内存或以某种方式调用未定义的行为,那么可能的原因几乎是无限的。可能它们都与stringstream 类无关,这只是巧合。
  • 是的。 somethings 可能会被毁掉。给我带来麻烦的两件事:A. this 在我尝试对成员进行操作时实际上已被删除,以及 B. 我无意中链接到标准库的不同变体(调试/发布或类似的混合)我正在尝试使用由一个实现创建的std::string,就好像它是另一个实现一样。
  • 选项 2 在我的情况下无法编译:s &lt;&lt; something.c_str() 导致 error C2297: '&lt;&lt;' : illegal, right operand has type 'const char *'(MS Visual Studio 2008,#include&lt;string&gt; 包含的字符串)

标签: c++ string stream


【解决方案1】:

如果字符串包含空字符'\0'则不同。

.c_str() 版本将计算长度直到 nul,而 std::string 输出将知道其长度并输出其所有字符。

【讨论】:

  • 感谢您的输入-尽管我知道这些差异-您是否有机会知道在用于初始化c时如何将文字字符串“Hello World”存储在程序内存中-字符串而不是 std::string?这可能有很大帮助:)
  • 那里没有区别。 std::string 构造函数将从字符串文字复制,char str[] = ".." 也是如此。输出运算符将对 char* 使用 strlen,对 std::string 使用 .size()。这就是所有的区别。除非数据以某种方式损坏......
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2021-03-23
  • 2023-01-22
  • 2020-03-26
  • 2010-12-12
  • 2017-06-02
相关资源
最近更新 更多