为什么第一条语句出错,而第二条语句却没有? (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] + "."
在这个表达式中:
first
是 std::string
.
- 因此,
first[0]
是 char
(省略了一些无关紧要的技术细节)。
"."
是一个 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]) + ".";
目标是获取名字、中间名和姓氏的首字母,每个名字后跟一个句点。
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] + "."
在这个表达式中:
first
是std::string
.- 因此,
first[0]
是char
(省略了一些无关紧要的技术细节)。 "."
是一个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]) + ".";