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 个字符:\
(一个反斜杠)、x
、1
和 0
。如果您希望它作为单个字符,则不要转义反斜杠 - \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。
有一些关于 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 个字符:\
(一个反斜杠)、x
、1
和 0
。如果您希望它作为单个字符,则不要转义反斜杠 - \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。