如何在 C++ 中使用字符串 find()

在本文中,我们将看看如何在C++中使用 **String find()。

如果我们想检查一个字符串是否包含另一个字符串,那么 std::string.find() 方法非常有用。


C++中的 String find() 语法

这个方法属于 C++ 字符串类(‘std::string’)。因此,我们必须包括标题文件 <string>,

我们必须在一个字符串对象上调用这一点,使用另一个字符串作为一个参数。

然后 find() 方法会检查给定的字符串是否位于我们的字符串中. 它会返回包含 '\0' 的终结字符(作为 size_t`)的子字符串的大小。

因此,该函数是这样定义的:

1size_t find(const std::string& my_string, size_t pos = 0);

还有一个参数,pos,它定义了要搜索的起始位置。

默认情况下,它是0,所以除非您明确指定开始位置,否则搜索将从字符串的开始进行。

另外,请注意,字符串由 **const 参考 ** 传递。

由于我们没有修改任何一个字符串,所以不要浪费时间创建一个临时字符串,因为我们可以直接使用引用来工作。

**注:从 C++20开始,许多标准库方法现在是constexpr兼容的,所以它们在编译时间本身执行。

有几个函数过载,其中大多数我会跳过,因为您可以查看 This页面以获取更多信息。

1size_t find( const Char* s, size_type pos, size_type count )

这个特定的过载检查了底线是否位于我们的字符串内,但它也有底线长度的限制,这将匹配直到字符。

但是这 cannot用于 std::string. 请注意,在原型中 const Char*. 所以,我们只能在 C 风格的字符串中使用它。

例如,如果我们将地狱字符串转到你好这个函数。

1std::cout << "Hello".find("Hell", 0, 3) << std::endl;

这只会匹配3个字符,从你好的开始,所以,我们只会得到4个字节作为输出,而不是5个字节。

现在让我们看看一些例子来理解我们学到的东西。


在 C++ 中使用 string.find()

让我们看看默认调用,当pos=0时。

 1#include <iostream>
 2#include <string>
 3
 4int main() {
 5    // Create our string
 6    std::string my_str("Hello from JournalDev");
 7    // Target string to search for
 8    std::string target_string("JournalDev");
 9
10    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
11    size_t substring_length = my_str.find(target_string);
12    if (substring_length == 0)
13        std::cout << "No\n";
14    else
15        std::cout << "Length of matched substring = " << substring_length << std::endl;
16
17    return 0;
18}

出发点:

1Is JournalDev a substring of Hello from JournalDev ?
2Length of matched substring = 11

正如你所看到的,底线确实存在于我们的原始字符串中!

现在让我们从字符串上的特定位置搜索相同的子字符串。

 1#include <iostream>
 2#include <string>
 3
 4int main() {
 5    // Create our string
 6    std::string my_str("Hello from JournalDev");
 7    // Target string to search for
 8    std::string target_string("JournalDev");
 9
10    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
11    size_t substring_length = my_str.find(target_string, 12); // Start from index 12 (from my_str[12])
12    if (substring_length == 0)
13        std::cout << "No\n";
14    else
15        std::cout << "Length of matched substring = " << substring_length << std::endl;
16
17    return 0;
18}

出发点( )

1Is JournalDev a substring of Hello from JournalDev ?
2Length of matched substring = 18446744073709551615

为什么我们会得到这样一个奇怪的输出呢?既然我们从原始字符串的索引12开始,而我们的子字符串的长度,从这个位置开始,将超出原始字符串的长度!

因此,我们到达一个垃圾位置后,到达我们的字符串的尽头. find() 超越字符串的尽头,所以要记住这一点。

因此,我们将通过检查我们是否已经到达了弦的尽头来修复这种危险的状态。

C++有一个名为std::string::npos的特殊变量,该变量返回当前字符串的握手,我们可以使用它来检测我们是否已经到达了字符串的尽头。

1if (my_str.find(target_str) != std::string::npos) {
2    // This matches! We're still within the original string
3}
4else {
5    // Oops! Out of bounds. Print error message!
6}

有了这个变化,我们的代码现在将看起来像这样:

 1#include <iostream>
 2#include <string>
 3
 4int main() {
 5    // Create our string
 6    std::string my_str("Hello from JournalDev");
 7    // Target string to search for
 8    std::string target_string("JournalDev");
 9
10    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
11    size_t substring_length;
12    if ((substring_length = my_str.find(target_string, 12)) != std::string::npos) {
13        std::cout << "Length of matched substring = " << substring_length << std::endl;
14    }
15    else {
16        std::cout << "No\n";
17    }
18
19    return 0;
20}

出口

1Is JournalDev a substring of Hello from JournalDev ?
2No

现在,我们得到预期的产量,因为我们从指数12开始!

讓我們用這個檢查來顯示其他過載的「find()」形式,使用「 count」。

 1#include <iostream>
 2#include <string>
 3
 4int main() {
 5    // Create our string
 6    std::string my_str("Hello from JournalDev");
 7    // Target string to search for
 8    std::string target_string("Journ_kkfffsfsfskkk");
 9
10    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
11    size_t substring_length;
12    // Use a count to match only 5 characters
13    // Note that we can use this form only for const char* strings
14    if ((substring_length = my_str.find("Journ_kkfffsfsfskkk", 0, 5)) != std::string::npos) {
15        std::cout << "Length of matched substring = " << substring_length << std::endl;
16    }
17    else {
18        std::cout << "No\n";
19    }
20
21    return 0;
22}

出发点( )

1Is Journ_kkfffsfsfskkk a substring of Hello from JournalDev ?
2Length of matched substring = 11

请注意,我们已经更改了我们的目标字符串,虽然只有前5个字符将被匹配,这对于find()就足够了,因为我们已经设置了5个对比限制!

因此,它只会忽略目标子串的其余部分,并继续匹配我们的原始字符串,直到字符串的尽头!

这就是为什么我们仍然得到11个,因为这就是底线匹配的地方。


结论

希望,通过所有这些示例,你已经明白了如何在C++中轻松地开始使用字符串.**find()**方法. 如果你有任何疑问,请在下面的评论部分询问他们!

此外,看看我们的其他一些与C++相关的文章在我们的教程部分( / 社区 / 教程 / c-plus-plus)!


参考


Published At
Categories with 技术
Tagged with
comments powered by Disqus