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
- ваш надежный помощник.
Упражнения
-
Базовое использование
string::find
:
Напишите программу на C++, которая просит пользователя ввести основную строку и подстроку. Используйте методstring::find
для поиска подстроки в основной строке и отобразите позицию подстроки, если она найдена. Если подстрока не найдена, выведите соответствующее сообщение. -
Поиск всех вхождений подстроки:
На основе первой программы измените ее так, чтобы отображались позиции всех вхождений подстроки в основную строку. Вам потребуется использовать цикл и параметрpos
методаstring::find
. Выводите каждую позицию на новой строке. -
Сравнение функций
string::find
иsimpleFind
:
Используя предоставленную функциюsimpleFind
в статье, напишите программу, которая сравнивает результаты встроенной функцииstring::find
и пользовательской функцииsimpleFind
. Программа должна:- Просить пользователя ввести основную строку и подстроку.
- Использовать оба метода для поиска подстроки.
- Отображать позиции, возвращенные каждым методом.
- Если результаты совпадаю т, отобразить “Оба метода вернули одинаковый результат.”, в противном случае - “Методы вернули разные результаты.”
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение