为什么第一条语句出错,而第二条语句却没有? (C++ 子字符串)

Why do I get an error for the first statement, but not the second one? (C++ substring)

目标是获取名字、中间名和姓氏的首字母,每个名字后跟一个句点。

string first;
string middle;
string last;
string result;

在字符串结果中输入表达式。

我输入了:

result = first[0] + "." + middle[0] + "." last[0] + ".";

并收到以下错误:

invalid operands of types ‘const char*’ and ‘const char [2]’ to binary ‘operator+’

但是当我删除“.”时对于上面的语句,它编译没有任何错误。

解决方案最终是:

result = first.substr(0,1) + "." + middle.substr(0,1) + "." last.substr(0,1) + ".";

所以我的问题是,为什么我在添加 .string[0] 时会出现编译错误,而在添加 .string.substr(0,1) 时却不会出现编译错误?

first[0] + "."

在这个表达式中:

  1. firststd::string.
  2. 因此,first[0]char(省略了一些无关紧要的技术细节)。
  3. "." 是一个 char [2](两个 char 值的数组)。

在 C++ 中,将 char 值添加到 char [2] 是非法的,您不能只将 char 添加到数组。这在 C++ 中是根本不允许的。关于您可以对 C++ 中的其他内容执行的操作有多种规则。您可以将数值添加到其他数值。您可以将整数值添加到指针。最后,class 可以定义自己的 + 运算符。差不多就是这样。 None of this 适用于此表达式,因此出现编译错误。

现在,如果您返回并重新阅读您的编译器向您显示的实际错误消息,它应该非常有意义。

这和你想的不一样(你应该测试过):

first[0] + middle[0] + last[0]

其中每个都是单个字符,在 C++ 中,单个字符本质上是 one-byte 整数。因此,添加它们只是添加它们的 ASCII 值(有关这些数字,请参阅 https://www.asciitable.com/)。

first.substr(0,1)给你一个字符串,字符串可以用+.

拼接

做你想做的另一种方法是:

result.append(first[0]);
result.append('.');
result.append(middle[0]);
result.append('.');
result.append(last[0]);

这只是一次添加一个字符。如果需要,您还可以传递 result.append("...") 之类的字符串。 ' 单引号是文字 char 而不是文字字符串(字符数组)的原因。

虽然您的问题得到了很好的回答,但与 substr 相比,我更喜欢以下其他选项。

#include <sstream>
...
std::ostringstream compose;
compose << first[0] << "." << middle[0] << "." << last[0] << ".";
std::string result = compose.str(); 

string result = string(first[0]) + "." + string(middle[0]) + "." + string(last[0]) + ".";