Поиск по сайту:

Как использовать строку find() в C++


В этой статье мы рассмотрим, как мы можем использовать String find() в C++.

Если мы хотим проверить, содержит ли строка другую строку, очень полезен метод std::string.find(). Давайте разберемся, как мы можем использовать этот метод, на нескольких примерах!

Синтаксис строки find() в C++

Этот метод относится к классу строк C++ (std::string). И поэтому мы должны включить заголовочный файл <string>,

Мы должны вызвать это для строкового объекта, используя другую строку в качестве аргумента.

Затем метод find() проверит, находится ли данная строка в нашей строке. Он вернет размер подстроки, включая завершающий символ \0 (как size_t). Но если строка не лежит в нашей исходной строке, она вернет 0.

При этом функция определяется следующим образом:

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

Есть еще один параметр, pos, который определяет начальную позицию для поиска.

По умолчанию он равен 0, поэтому, если вы явно не укажете начальную позицию, поиск будет выполняться с начала строки.

Также обратите внимание, что строка передается по константной ссылке.

Поскольку мы не изменяем ни одну из строк, имеет смысл не тратить время на создание временной строки, поскольку мы можем напрямую работать со ссылками.

ПРИМЕЧАНИЕ. Начиная с C++20, многие методы стандартной библиотеки теперь совместимы с constexpr, поэтому они выполняются непосредственно во время компиляции. Подробнее о тонкостях constexpr можно прочитать в Интернете.

Есть несколько перегруженных функций, большинство из которых я пропущу, так как вы можете просмотреть эту страницу для получения дополнительной информации. Вместо этого мы сосредоточимся на одной конкретной перегрузке, связанной с длиной подстроки.

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

Эта конкретная перегрузка проверяет, находится ли подстрока в нашей строке, но также имеет ограничение на длину подстроки. Это будет соответствовать до count символов.

Но это нельзя использовать для std::string. Обратите внимание, что const Char* в прототипе. Таким образом, мы можем использовать это только для строк в стиле C.

Например, если мы передаем этой функции подстроку \Hell в \Hello.

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

Это будет соответствовать только 3 символам от начала «Hello». Таким образом, мы получим только 4 байта в качестве вывода, а не 5.

Давайте теперь рассмотрим несколько примеров, чтобы понять, чему мы научились.

Использование string.find() в C++

Давайте посмотрим на вызов по умолчанию, когда pos=0. Мы просто будем искать всю подстроку с начала строки.

#include <iostream>
#include <string>

int main() {
    // Create our string
    std::string my_str("Hello from JournalDev");
    // Target string to search for
    std::string target_string("JournalDev");

    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
    size_t substring_length = my_str.find(target_string);
    if (substring_length == 0)
        std::cout << "No\n";
    else
        std::cout << "Length of matched substring = " << substring_length << std::endl;

    return 0;
}

Выход:

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

Как видите, подстрока действительно находится внутри исходной строки!

Давайте теперь найдем ту же самую подстроку с определенной позиции в строке.

#include <iostream>
#include <string>

int main() {
    // Create our string
    std::string my_str("Hello from JournalDev");
    // Target string to search for
    std::string target_string("JournalDev");

    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
    size_t substring_length = my_str.find(target_string, 12); // Start from index 12 (from my_str[12])
    if (substring_length == 0)
        std::cout << "No\n";
    else
        std::cout << "Length of matched substring = " << substring_length << std::endl;

    return 0;
}

Выход

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

Почему мы получаем такой странный результат? Ну, так как мы начали с индекса 12 на исходной строке, и длина нашей подстроки с этой позиции будет выходить за длину исходной строки!

Поэтому мы отправляемся в мусорное место после достижения конца нашей строки. find() выходит за конец строки, так что имейте это в виду.

Поэтому мы исправим это опасное состояние, проверив, достигли ли мы конца строки.

В C++ есть специальная переменная с именем std::string::npos, которая возвращает дескриптор текущей строки, который мы можем использовать, чтобы определить, достигли ли мы конца нашей строки.

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

С этим изменением наш код теперь будет выглядеть так:

#include <iostream>
#include <string>

int main() {
    // Create our string
    std::string my_str("Hello from JournalDev");
    // Target string to search for
    std::string target_string("JournalDev");

    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
    size_t substring_length;
    if ((substring_length = my_str.find(target_string, 12)) != std::string::npos) {
        std::cout << "Length of matched substring = " << substring_length << std::endl;
    }
    else {
        std::cout << "No\n";
    }

    return 0;
}

Выход

Is JournalDev a substring of Hello from JournalDev ?
No

Теперь мы получаем ожидаемый результат, поскольку начинаем с индекса 12!

Давайте воспользуемся этой проверкой, чтобы показать другую перегруженную форму find(), используя count. Помните, что мы не можем использовать эту форму непосредственно в строках C++.

#include <iostream>
#include <string>

int main() {
    // Create our string
    std::string my_str("Hello from JournalDev");
    // Target string to search for
    std::string target_string("Journ_kkfffsfsfskkk");

    std::cout << "Is " << target_string << " a substring of " << my_str << " ?\n";
    size_t substring_length;
    // Use a count to match only 5 characters
    // Note that we can use this form only for const char* strings
    if ((substring_length = my_str.find("Journ_kkfffsfsfskkk", 0, 5)) != std::string::npos) {
        std::cout << "Length of matched substring = " << substring_length << std::endl;
    }
    else {
        std::cout << "No\n";
    }

    return 0;
}

Выход

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

Обратите внимание, что мы изменили нашу целевую строку. Здесь, хотя будут найдены только первые 5 символов, этого достаточно для find(), так как мы установили ограничение счетчика в 5!

Таким образом, он просто проигнорирует остальную часть целевой подстроки и продолжит сопоставление нашей исходной строки до конца строки!

Вот почему мы по-прежнему получаем 11, так как именно там находится совпадение подстроки.

Заключение

Надеюсь, из всех этих примеров вы поняли, как легко начать использовать метод string.find() в C++. Если у вас есть какие-либо сомнения, задайте их в разделе комментариев ниже!

Кроме того, ознакомьтесь с некоторыми другими нашими статьями, связанными с C++, в нашем разделе учебных пособий!

Рекомендации

  • Страница cppreference.com об использовании строки find() в C++
  • Вопрос StackOverflow по строке find()