string::find в C++ (с примерами)

Привет! Сегодня мы подробно рассмотрим популярную функцию C++, которая помогает искать в строках - string::find. Начнем с ознакомления с этой функцией, объясним, как ее правильно использовать, продемонстрируем ее поведение на примерах и завершим урок созданием собственной простой функции поиска в строке.

Поиск подстрок в C++ с помощью string::find

Если вы хотите проверить, существует ли определенная последовательность символов или подстрока в другой строке в C++, вы можете использовать функцию string::find:

size_t string::find(const string& str, size_t pos = 0) const noexcept;
  • Эта функция принимает строку str, которую вы хотите найти.
  • У нее также есть необязательный параметр pos, указывающий, с какой позиции начать поиск.
  • Функция возвращает позицию первого вхождения подстроки. Если подстрока не найдена, она возвращает string::npos.

Рассмотрим базовую программу, использующую string::find для проверки позиции подстроки:

#include <iostream>
#include <string>
using namespace std;

int main() {
  string mainStr = "Привет, это CodeLessons!";
  size_t pos = mainStr.find("CodeLessons");

  if(pos != string::npos) {
      cout << "Найдено 'CodeLessons' на позиции: " << pos << endl;
  } else {
      cout << "Не удалось найти 'CodeLessons'." << endl;
  }

  return 0;
}

Запустив вышеуказанный код, вы получите:

Найдено 'CodeLessons' на позиции: 21

Что происходит внутри string::find?

На первый взгляд функция может показаться сложной, но string::find работает по довольно простому принципу. Она сканирует основную строку и ищет первый символ подстроки. Найдя его, она проверяет, совпадают ли следующие символы с подстрокой. Если все символы совпадают, она возвращает позицию. Если нет, поиск продолжается.

Но что, если подстрока встречается в основной строке несколько раз? string::find вернет вам позицию только первого вхождения. Если вам нужно найти все вхождения, вам потребуется запустить string::find в цикле, обновляя параметр pos каждый раз.

Создаем простую функцию поиска в строке

Для развлечения и лучшего понимания давайте создадим простую собственную версию функции string::find. Назовем нашу функцию simpleFind.

#include <iostream>
#include <string>
using namespace std;

size_t simpleFind(const string& mainStr, const string& subStr) {
    for(size_t i = 0; i <= mainStr.length() - subStr.length(); i++) {
        size_t j;
        for(j = 0; j < subStr.length(); j++) {
            if(mainStr[i + j] != subStr[j]) {
                break;
            }
        }
        if(j == subStr.length()) {
            return i;
        }
    }
    return string::npos;
}

int main() {
    string text = "Добро пожаловать в урок CodeLessons!";
    size_t found = simpleFind(text, "урок");

    if(found != string::npos) {
        cout << "Найдено 'урок' на позиции: " << found << endl;
    } else {
        cout << "Не удалось найти 'урок'." << endl;
    }

    return 0;
}

Запуск программы должен дать:

Найдено 'урок' на позиции: 35

Наша функция simpleFind работает, но имейте в виду, что это базовая версия. Встроенная функция string::find оптимизирована для производительности и лучше обрабатывает граничные случаи.

Заключение

string::find - незаменимый инструмент для работы со строками в C++. Он предоставляет простой и эффективный способ поиска подстрок. Понимание ее работы, а также способа воссоздания ее базовой функциональности, важно для всех, кто работает с текстовыми данными в C++. Независимо от того, создаете ли вы поисковый движок или просто выполняете некоторые простые строковые манипуляции, string::find - ваш надежный помощник.

Упражнения

  1. Базовое использование string::find:
    Напишите программу на C++, которая просит пользователя ввести основную строку и подстроку. Используйте метод string::find для поиска подстроки в основной строке и отобразите позицию подстроки, если она найдена. Если подстрока не найдена, выведите соответствующее сообщение.

  2. Поиск всех вхождений подстроки:
    На основе первой программы измените ее так, чтобы отображались позиции всех вхождений подстроки в основную строку. Вам потребуется использовать цикл и параметр pos метода string::find. Выводите каждую позицию на новой строке.

  3. Сравнение функций string::find и simpleFind:
    Используя предоставленную функцию simpleFind в статье, напишите программу, которая сравнивает результаты встроенной функции string::find и пользовательской функции simpleFind. Программа должна:

    • Просить пользователя ввести основную строку и подстроку.
    • Использовать оба метода для поиска подстроки.
    • Отображать позиции, возвращенные каждым методом.
    • Если результаты совпадают, отобразить “Оба метода вернули одинаковый результат.”, в противном случае - “Методы вернули разные результаты.”

Обсуждение