为什么我的字符串没有打印?

时间:2011-02-03 06:09:55

标签: c++ string std cout

我有一些代码,以最小的完整形式展示问题(在提问时成为一个好公民),基本归结为以下几点:

#include <string>
#include <iostream>
int main (void) {
    int x = 11;
    std::string s = "Value was: " + x;
    std::cout << "[" << s << "]" << std::endl;
    return 0;
}

我期待它输出

[Value was: 11]
相反,而不是那样,我只是:

[]

为什么?为什么我不能输出我的字符串?字符串是空白的吗? cout某种程度上被打破了吗?我离开了吗?

5 个答案:

答案 0 :(得分:8)

"Value was: "的类型为const char[12]。向其中添加整数时,您实际上是引用该数组的元素。要查看效果,请将x更改为3

您必须明确构建std::string。然后,您不能连接std::string和整数。要解决此问题,您可以写入std::ostringstream

#include <sstream>

std::ostringstream oss;
oss << "Value was: " << x;
std::string result = oss.str();

答案 1 :(得分:4)

你不能添加一个字符指针和一个这样的整数(你可以,但它不会做你想要的)。

您需要先将x转换为字符串。您可以使用itoa函数将整数转换为字符串,从而在C方式带外执行:

char buf[5];
itoa(x, buf, 10);

s += buf;

或者带有sstream的STD方式:

#include <sstream>

std::ostringstream oss;
oss << s << x;
std::cout << oss.str();

或直接在cout行:

std::cout << text << x;

答案 2 :(得分:4)

有趣:)这就是我们支付的C兼容性以及缺少内置string

无论如何,我认为最可读的方法是:

std::string s = "Value was: " + boost::lexical_cast<std::string>(x);

由于此处lexical_cast返回类型为std::string,因此将选择+的正确重载。

答案 3 :(得分:2)

C ++不使用+运算符连接字符串。也没有从数据类型到字符串的自动提升。

答案 4 :(得分:2)

在C / C ++中,您不能使用+运算符将整数附加到字符数组,因为char数组会衰减到指针。要将int附加到string,请使用ostringstream

#include <iostream>
#include <sstream>

int main (void) {  
  int x = 11;
  std::ostringstream out;
  out << "Value was: " << x;
  std::string s = out.str();
  std::cout << "[" << s << "]" << std::endl;
  return 0;
}