从根本上说,因为 C++ 从“C with classes”开始。多年来,添加了许多新功能并收紧了一些规则,但 C++ 作为扩展 C 的背景仍然清晰可见。特别是。
- 该语言没有正确区分字符和整数。 “char”类型只是语言中最小的整数类型。
- 常规字符串文字将包含以空字符结尾的字符串的常量数组中的第一个字符计算为指针,而不是现代字符串类型。
std::string (严格来说是 std::basic_string 模板,但现在让我们忽略这个细节)最好能帮助你。它定义了合理的重载(再次忽略右值引用的细节)。
- std::string + std::string
- std::string + char*
- std::string + char
- char* + std::string
- char + std::string
但它不能对两个参数都不是 std::string 的运算符做任何事情。它们在 C++ 中的工作方式与在 C 中的工作方式相同。
- char* + char* --> 错误
- char + char --> 整数加法
- char* + char --> 指针运算
- char + char* --> 指针运算
这样做的结果是操作顺序变得非常重要。
c=c+"#"+a[i]; 等价于c=((c+"#")+a[i]);。这很好用,在最内部的操作中,一个参数是 std::string,因此重载的运算符会做正确的事情并将参数连接起来以产生另一个 std::string。当我们将最内层操作的结果连接到 a[i]
时,同样适用
c+="#"+a[i]; 在功能上等同于* c=(c+("#"+a[i])); 所以现在我们尝试在计算为 char * 的字符串文字和计算为 char 的操作之间使用 + 运算符。所以我们将a[i]处的字符的字符代码添加到指向字符串“#”的指针中。
因为“#”是一个相当短的字符串,这几乎肯定会导致指针超出字符串的末尾。这是语言规范未定义的行为。
我猜“!boxboxbox”是来自 onlinegdb 的沙盒错误。它检测到您的代码在做不该做的事情,并拒绝让它继续执行。
许多编译器/链接器将不同的字符串数据放在一起,因此在常规编译器上显示来自可执行文件(或它使用的库)的另一个字符串(部分)很可能是在字符串末尾运行的结果。
C++11 确实添加了对 std::string 字面量的支持,因此一个修复方法可能是添加
using namespace std::string_literals;
然后将"#"改为"#"s
* 请注意,通常在 c++ 中重载运算符时,“+”和“+=”是独立的运算符,没有什么会强制类的实现者使它们在功能上等效。不过,理智的类设计师通常会这样做。
另外 += 可能更有效,因为它可能能够就地执行连接而不是创建新字符串。