在什么情况下 std::basic_string::find 的计数参数大于字符串长度会有用?

In what case std::basic_string::find with a count argument greater than the string length can be useful?

std::basic_string::find method 的签名之一是:

size_type find( const CharT* s, size_type pos, size_type count ) const;

参数如下:

pos    - position at which to start the search

count - length of substring to search for

s         - pointer to a character string to search for

此重载方法的行为描述为:

Finds the first substring equal to the range [s, s+count). This range may contain null characters.

我想知道在什么情况下使用包含空字符的范围会很有用。例如:

s.find("A", 0, 2);

这里,s对应一个长度为1的字符串,因为count为2,所以[s,s+count)范围内包含一个空字符。重点是什么?

有个假前提你没有拼出来,但是结合题目和问题是:

The null character indicates the end of a std::string.

这是错误的。 std::strings 可以在任何位置包含空字符。必须谨慎对待期望以 null 结尾的 c 字符串的函数,但是 find 非常好,它明确地提醒您它也适用于一般情况。

C 字符串以 null 结尾,因此:

std::string x("My[=10=]str0ing[=10=]with[=10=]null[=10=]characters");
std::cout << x.size() << '\n';

打印:2,即只有[=18=]之前的字符用于构造std::string

然而,这

std::string s("Hello world");
s[5] = '[=11=]';
std::cout << s << '\n';

打印 Helloworld(因为 [=18=] 不可打印)。 char 数组也可以在任何位置包含 [=18=]。通常这被解释为字符串的终止字符。然而,由于 std::strings 可以在任何位置包含空字符,因此提供一个重载也是一致的,该重载采用指向中间可以包含空字符的字符数组的指针。使用该重载的一个示例是(s 是上面的字符串)

std::string f;
f.push_back('[=12=]');
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';

输出:

0
0
5

没有 count 参数的重载假定一个空终止的 c 字符串,因此 s.find(f.c_str())s.find("") 相同。只有具有 count 参数的重载才会在索引 5.

处找到子字符串 [=30=]w