std::basic_string::find
method的签名之一是:
std::basic_string::find
参数如下:
pos-开始搜索的位置
count-要搜索的子字符串的长度
s -指向要搜索的字符串的指针
对此重载方法的行为的描述是:
查找等于范围[s,s + count)的第一个子字符串。此范围可能包含空字符。
我想知道在什么情况下让一个包含空字符的范围会很有用。例如:
size_type find( const CharT* s, size_type pos, size_type count ) const;
这里,s.find("A", 0, 2);
对应于长度为1的字符串。由于s
为2,所以范围[s,s + count)包含空字符。有什么意义?
有一个错误的前提,您没有说明,但是将标题和问题结合在一起:
空字符表示
count
的结尾。
这是错误的。 std::string
可以在任何位置包含空字符。必须谨慎对待以空值结尾的c字符串的函数,但是std::string
非常好,以至于它明确地提醒您在一般情况下也可以使用。
C字符串以null结尾,因此:
find
打印:std::string x("My\0str0ing\0with\0null\0characters");
std::cout << x.size() << '\n';
,即仅使用2
之前的字符来构造\0
。
但是,此
std::string
打印std::string s("Hello world");
s[5] = '\0';
std::cout << s << '\n';
(因为Helloworld
无法打印。而且\0
数组在任何位置上都可以包含char
。通常将其解释为字符串的终止字符。但是,由于\0
可以包含字符串在任何位置都为null字符,这也是一致的,它还提供了一个重载,该重载指向一个字符数组的指针,该字符数组的中间可以包含null字符。使用该重载的示例是
std::string
输出:
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';
没有0
0
5
参数的重载假定终止字符串为空,因此count
与s.find(f.c_str())
相同。仅在具有s.find("")
参数的重载的情况下,才在索引5处找到子字符串count
。