有一些关于std::string::find的帖子(就像这里的这个和这个一样),但我的情况有些不同:
#include <string>
#include <stdio.h>
int main(int argc, char **argv)
{
std::string haystack = "ab\x10c200\x00\x00\x00\x00";
std::string needle = "\x00";
printf("first index is %dn",(int) haystack.find(needle));
return 0;
}
根据这些值,我想知道为什么返回 8:
我猜"\200"算作 1 个字符(? 我可以让find
"\x10"
也视为 1 个字符吗?
一切正常
+---+---+---+---+---+---+---+------+---+---+---+---+
| a | b | | x | 1 | 0 | c | 200 | | x | 0 | 0 |
+---+---+---+---+---+---+---+------+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | | |
+---+---+---+---+---+---+---+------+---+---+---+---+
\
变成了一个字符.看来你想用一个
xNN
.
即使您将\
替换为文字字符串中的,它也不起作用,因为第一个
x00
将被视为终止零,并且在它被忽略之后将被视为终止其他字符。我想字符串的初始化应该如下所示:
std::string haystack = {'a', 'b', 'x10', 'c', '200', 'x00', 'x00', 'x00', 'x00'};
std::string needle = {'x00'};
程序将输出 5。
200
是1 个字符。请参阅转义序列列表。我在这里包括了相关的:
Escape sequence Description Representation
\ backslash byte 0x5c in ASCII encoding
nnn arbitrary octal value byte nnn
xnn arbitrary hexadecimal value byte nn
200
是值为 128 的单个字符(八进制中的 200 是十进制中的 128)。
\x10
是 4 个字符:\
(反斜杠)、x
、1
和0
。如果您希望将其作为单个字符,请不要转义反斜杠 -x10
是值为 16 的单个字符(十六进制中的 10 是十进制中的 16)。
200
是零宽度非连接器之一。这是一个以 UTF-8 编码的 unicode 字符。
例如-
0x2e, 0x80, 0x8c (or in base 8, 342, 200, 214)
以下是字符串的索引方式:
0 A
1 b
2 \3 x 4 1
5 0 6 c
7
8 \9 x 10 0 11 0 12 \13 x 14 0 15 0 16 \17 x 18 0 19 0 20 \
21 x
22 0 23 0
请参阅7th
索引。这将消除您的疑虑。
如果要将\x10
读取为单个字符,请使用x10
将其视为十六进制数。