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

问题描述 投票:0回答:1

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)包含空字符。有什么意义?

c++ stdstring
1个回答
5
投票

有一个错误的前提,您没有说明,但是将标题和问题结合在一起:

空字符表示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 参数的重载假定终止字符串为空,因此counts.find(f.c_str())相同。仅在具有s.find("")参数的重载的情况下,才在索引5处找到子字符串count

© www.soinside.com 2019 - 2024. All rights reserved.