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-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение