将std :: string和std :: string :: c_str()放入字符串流中有什么区别?

时间:2011-08-26 15:41:02

标签: c++ string stream

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

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();

我知道这听起来很疯狂(或者它对我有用),而且我无法将其复制出更大的系统 - 很抱歉没有“工作”的例子。但有谁知道这种事情会发生什么?我们可以在某个地方踩到内存,或者在某个地方或其他任何地方对某个字符串做某事吗?

1 个答案:

答案 0 :(得分:4)

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

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