字符串拼接不像预期的那样工作

84

我知道这是一个普遍的问题,但是在寻找参考和其他材料时,我没有找到一个明确的答案。

考虑以下代码:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

编译器告诉我它找不到一个适用于char[dim]的重载运算符。

这是不是意味着字符串中没有+运算符?

但是在几个例子中都有类似这样的情况。如果这不是连接多个字符串的正确方式,那么最好的方法是什么?


15
你的代码应该可以顺利编译,这意味着你没有展示导致错误的确切代码(除了没有发布准确的错误信息)。 - sbi
好吧,它不起作用... 可能是我的错,我没有提供编译器... 它应该是g++而不是vc... :) - Andry
4个回答

155

你的代码按照编写的方式可以工作。你可能正试图实现一些不相关但相似的东西:

std::string c = "hello" + "world";

这样做不起作用,因为对于C++而言,这似乎是在尝试添加两个char指针。相反,您需要将至少一个char*字面值转换为std::string。您可以像您在问题中已经发布的那样(正如我所说,这段代码将会工作),或者您可以执行以下操作:

std::string c = std::string("hello") + "world";

3
char* 是一个指针,不能简单地进行加法操作,因为这需要分配内存。std::string 隐藏了内存分配的过程,这就是为什么可以为它们提供 operator+ 的原因。 - Vincent Robert
12
这段代码无法正常工作的原因是C++继承了C语言的字符串字面量,因此它们的类型是const char[]而不是std::string。在C语言(因此也包括C++)中,数组很容易退化为指针,这就是为什么"a"+"b"会调用内置的运算符来添加两个指针的原因。其结果是一个指向某个内存位置的指针,当然是没有用处的,但我们却束手无策。 - sbi
2
@Andry:看起来合理但是不正确。分配与此无关。@sbi 给出的解释是正确的(除了指针加法的结果不是另一个指针 - 由于结果毫无意义,因此不可能添加两个指针)。 - Konrad Rudolph
1
此外,直接相邻的字符串字面量会被编译器自动连接起来。 例如,std::string c = "Hello" "world"; 将导致 c == "Helloworld" - Fang
1
你也可以使用字符串字面量:std::string c = "hello"s + "world"s; 或者只将其中一个转换为 std::string - Rakete1111
显示剩余3条评论

46
std::string a = "Hello ";
a += "World";

2
如果我还有点赞的机会,我就给你点赞了! - jwueller
抱歉,这是C++而不是C#,i += 在这里不起作用,它的用途是什么。 - Pratik
18
你确定吗?这是一个关于C++中string类的operator+=运算符的链接。 - Fraser

5
我会这样做:
std::string a("Hello ");
std::string b("World");
std::string c = a + b;

这可以在VS2008中编译。


1
应该也可以在gcc中工作。 - graham.reeds

5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接