std::basic_string::find方法的签名之一是:
size_type find( const CharT* s, size_type pos, size_type count ) const;
Run Code Online (Sandbox Code Playgroud)
参数如下:
pos - 开始搜索的位置
count - 要搜索的子字符串的长度
s - 指向要搜索的字符串的指针
此重载的方法行为的描述是:
查找等于范围 [s, s+count) 的第一个子字符串。此范围可能包含空字符。
我想知道在什么情况下有一个包含空字符的范围会很有用。例如:
s.find("A", 0, 2);
Run Code Online (Sandbox Code Playgroud)
这里,s对应一个长度为1的字符串。因为count是2,范围[s,s+count)包含一个空字符。重点是什么?
有一个错误的前提,您没有拼写出来,而是将标题和问题结合起来:
空字符表示 a 的结尾
std::string。
这是错误的。std::strings 可以在任何位置包含空字符。人们必须谨慎对待期望以空字符结尾的 c 字符串的函数,但find它非常好,它明确提醒您它也适用于一般情况。
C 字符串是空终止的,因此:
std::string x("My\0str0ing\0with\0null\0characters");
std::cout << x.size() << '\n';
Run Code Online (Sandbox Code Playgroud)
打印:2,即仅\0使用之前的字符来构造std::string。
然而,这
std::string s("Hello world");
s[5] = '\0';
std::cout << s << '\n';
Run Code Online (Sandbox Code Playgroud)
打印Helloworld(因为\0不可打印)。还char阵列可以包含\0在任何postition。通常这被解释为字符串的终止字符。但是,由于std::strings 可以在任何位置包含空字符,因此提供一个重载以指向可以在中间包含空字符的字符数组的指针也是一致的。使用该重载的一个示例是 (s是上面的字符串)
std::string f;
f.push_back('\0');
f.push_back('w');
std::cout << s.find(f.c_str()) << '\n';
std::cout << s.find("") << '\n';
std::cout << s.find(f.c_str(),0,2) << '\n';
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
5
Run Code Online (Sandbox Code Playgroud)
没有count参数的重载假定一个空终止的 c 字符串,因此s.find(f.c_str())与s.find(""). 只有使用具有count参数的重载才能\0w在索引 5 处找到子字符串。