std :: string :: find返回错误的答案

时间:2018-04-23 12:55:04

标签: c++ find hex stdstring

有一些关于std :: string :: find的帖子(如this one herethis 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个字符吗?

3 个答案:

答案 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个字符:\\(反斜杠),x10。如果你想把它作为单个字符,那么不要转义反斜杠 - \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将其视为十六进制数字。