Как найти подстроку в строке c
Перейти к содержимому

Как найти подстроку в строке c

  • автор:

Поиск подстроки в строке

Сейчас мы разберём на примерах, как может выглядеть алгоритм поиска подстроки в строке. Примеры будут основываться на функциях стандартных библиотек, ведь именно в таких функциях и проявляются все удобства написания программ. А вот классический разбор алгоритма, основанный на циклах и сравнениях, также достаточно примечателен. Поэтому мы его рассмотрим в этом же уроке.

Сам алгоритм в принципе очень прост. Есть две строки. Например «Hello world» и «lo»

Работать будем в два цикла:

  1. Первый будет выполнять проход по всей строке, и искать местоположение первой буквы искомой строки ( «lo» ).
  2. Второй, начиная с найденной позиции первой буквы – сверять, какие буквы стоят после неё и сколько из них подряд совпадают.

Проиллюстрируем поиск подстроки в строке:

алгоритмы поиска с++, поиск подстроки в строке, c++, как найти подстроку в строке, программирование на с++ для начинающих, доклад, курсовая работа

На первых двух итерациях цикла сравниваемые буквы не будут совпадать (выделено красным). На третьей итерации искомая буква (первый символ искомого слова) совпала с символом в строке, где происходит поиск. При таком совпадении в работу включается второй цикл.

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

На третьей итерации совпал только первый символ искомой строки, а вот второй уже не совпадает. Придется первому циклу продолжить работу. Четвертая итерация дает необходимые результаты – совпадают все символы искомой строки с частью исходной строки. А раз все символы совпали – подстрока найдена. Работу алгоритма можно закончить.

Посмотрим, как выглядит классический код поиска подстроки в строке в С++:

Найти вхождение подстроки в строку на Си

подскажите пожалуйста: есть два массива символов которые вводятся пользователем, нужно посимвольно их проверить и найти подстроку в строке без использования strstr, вывести индекс первого вхождения, никак не могу додуматься до нужного условия для цикла. вот код того что готово, нужно вроде только в циклы правильное условие:

 int main() < char str1[SIZE], str2[SIZE]; // объявляем массивы. printf("Input string: "); fill_str(str1); // вызываем функцию заполнения для первого массива(строка). printf("Input pattern: "); fill_str(str2); // вызываем функцию заполнения для второго массива(подстрока). print_str(find_str(str1, str2)); // функция вывода с аргументом возвращаемого значения из функции сравнения строк. getch(); return 0; >void fill_str(char str1[]) // заполнение массива. < gets(str1); // получаем ввод пользователя для заполнения массива >int find_str(char str1[], char str2[]) // функция для поиска строки в строкe. < int index; //index = strstr(str1, str2); // ищем вхождение строки 2 в строку 1 for() < for() < >> return index; // возвращаем индекс > void print_str(int index) // функция вывода.

Отслеживать
задан 28 авг 2019 в 8:27
3 1 1 серебряный знак 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

for(i=0; str1[i]!='\0'; i++) < for(j=i, k=0; str2[k]!='\0' && str1[j]==str2[k]; j++, k++) ; if(k>0 && str2[k]=='\0') < index = i; break; >> 

Отслеживать
ответ дан 28 авг 2019 в 8:46
88 7 7 бронзовых знаков

Благодарю, всё работает, буду разбираться теперь получше что и как происходит, только вот вопрос: почему к примеру если строка Hello а подстрока будет H то он говорит что не найдено? 0 индекс не проверяет походу

28 авг 2019 в 9:00
Сделай первоначальное значение index = -1 в функции find_str, в функции же print_str сравнивай с -1
28 авг 2019 в 9:07

туплю что-то, написал так: в итоге косяк — и везде кроме первого пишет что не входит в строку. int find_str(char str1[], char str2[]) < int i, j, k, index = -1; for(i = 0; str1[i]!= '\0'; i++) < for(j = i, k = 0; str2[k]!= '\0' && str1[j] == str2[k]; j++, k++); < if(k >0 && str2[k] == ‘\0’) index = i; break; > > return index; // возвращаем индекс > void print_str(int index) // функция вывода. < index != -1 ? printf("str1 in str2, entry i is: %d", index) : printf("str1 not in str2"); >

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 #include using namespace std; int main()  string mainStr = "Привет, это CodeLessons!"; size_t pos = mainStr.find("CodeLessons"); if(pos != string::npos)  cout  <"Найдено 'CodeLessons' на позиции: "   ; > else  cout  <"Не удалось найти 'CodeLessons'."  ; > return 0; >

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

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

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

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

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

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

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

#include #include 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  <"Найдено 'урок' на позиции: "   ; > else  cout  <"Не удалось найти 'урок'."  ; > return 0; >

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *