7

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

#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莫名其妙坏了?我疯了吗?

4

5 回答 5

8

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

您将不得不std::string显式地构造一个。再说一次,你不能连接一个std::string和一个整数。为了解决这个问题,您可以写入std::ostringstream

#include <sstream>

std::ostringstream oss;
oss << "Value was: " << x;
std::string result = oss.str();
于 2011-02-03T06:15:28.093 回答
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;
于 2011-02-03T06:13:17.513 回答
4

有趣 :) 这就是我们为 C 兼容性和缺乏内置string.

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

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

因为lexical_cast返回类型在这里,所以会选择std::string正确的重载。+

于 2011-02-03T07:49:33.573 回答
2

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

于 2011-02-03T06:13:40.680 回答
2

在 C/C++ 中,您不能使用+运算符将​​整数附加到字符数组,因为char数组会衰减为指针。要将 an 附加int到 a 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;
}
于 2011-02-03T06:16:09.157 回答