有一些关于std :: string :: find的帖子(如this one here和this one too)但我的情况有所不同:
#include <string>
#include <stdio.h>
int main(int argc, char **argv)
{
std::string haystack = "ab\\x10c\200\\x00\\x00\\x00\\x00";
std::string needle = "\\x00";
printf("first index is %d\n",(int) haystack.find(needle));
return 0;
}
根据值,我想知道为什么返回8:
我想&#34; \ 200&#34;被计为1个字符(?)
我可以find
将"\\x10"
视为1个字符吗?
答案 0 :(得分:4)
一切正常
+---+---+---+---+---+---+---+------+---+---+---+---+
| 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。
答案 1 :(得分:1)
\200
是 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
\200
是单个字符,其值为128(八进制中的200为十进制的128)。
\\x10
有4个字符:\\
(反斜杠),x
,1
和0
。如果你想把它作为单个字符,那么不要转义反斜杠 - \x10
是一个值为16的单个字符(十六进制为10,十进制为16)。
答案 2 :(得分:0)
\200
是 Zero Width Non Joiner 之一。这是一个以UTF-8编码的unicode字符。
e.g -
0x2e, 0x80, 0x8c (or in base 8, \342, \200, \214)
以下是您的字符串编入索引的方式:
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 x
18 0
19 0
20 \
21 x
22 0
23 0
请参阅7th
索引。这将清除你的怀疑。
如果您想将\\x10
作为单个字符读取,请使用\x10
将其视为十六进制数字。