std::string::find returns 错误答案

std::string::find returns wrong answer

有一些关于 std::string::find 的帖子(比如 this one here and this one too),但我的情况有些不同:

#include <string>
#include <stdio.h>

int main(int argc, char **argv)
{
    std::string haystack = "ab\x10c0\x00\x00\x00\x00";
    std::string needle   = "\x00";

    printf("first index is %d\n",(int) haystack.find(needle));

    return 0;
}

根据值我想知道为什么返回8:

我猜“\200”算作 1 个字符(?) 我可以让 find 也将 "\x10" 视为 1 个字符吗?

0 零宽度非连接器 之一。这是一个以 UTF-8 编码的 unicode 字符。

例如-

0x2e, 0x80, 0x8c (or in base 8, 2, 0, 4)

以下是您的字符串的索引方式:

0个
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×
18 0
19 0
20\
21×
22 0
23 0

查看 7th 索引。这将消除你的疑虑。

如果您想将 \x10 读取为单个字符,则使用 \x10 将其视为十六进制数。

0 1个字符。参见list of escape sequences。我在这里包括了相关的:

Escape sequence    Description                    Representation
\                 backslash                      byte 0x5c in ASCII encoding
\nnn               arbitrary octal value          byte nnn
\xnn               arbitrary hexadecimal value    byte nn

0 是一个值为 128 的单个字符(八进制的 200 是十进制的 128)。

\x10 是 4 个字符:\(一个反斜杠)、x10。如果您希望它作为单个字符,则不要转义反斜杠 - \x10 是值为 16 的单个字符(十六进制的 10 是十进制的 16)。

一切正常

+---+---+---+---+---+---+---+------+---+---+---+---+
| a | b | \ | x | 1 | 0 | c | 0 | \ | x | 0 | 0 |
+---+---+---+---+---+---+---+------+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |   7  | 8 |   |   |   |
+---+---+---+---+---+---+---+------+---+---+---+---+

\ 变成一个字符 \。看来你想要 \xNN 和一个 \.

即使您在文字字符串中将 \ 替换为 \,它也不会起作用,因为第一个 \x00 将被视为终止零和其他字符被忽略。我想字符串的初始化应该像下面这样:

std::string haystack = {'a', 'b', '\x10', 'c', '0', '\x00', '\x00', '\x00', '\x00'};
std::string needle   = {'\x00'};

程序会输出5。