Строки C++: поиск подстроки в строке на cpp
К сожалению во все времена камнем преткновения для многих начинающих c++ программистов была работа со строками. Была, есть и, даже после чтения десятков статей подобного содержания, будет. В данном посте я рассматриваю вопрос поиска подстроки в строке. Данный вопрос миллионы раз рассматривался, обсуждался и «переваривался» на форумах, сайтах, блогах, на русском, английском, французском (. ) языках людьми всех возрастов, вероисповеданий, расс. Я тоже хочу ответить на вопрос: «как найти подстроку в строке?» В данном случае мы рассмотрим самый простой вариант — это поиск подстроки в строке типа string. Здесь задача решается одной функцией в 14 строк. Сразу приведу функцию, которую я накидал:
int count_of_substrings(string src, string sub) < int start = 0; int count = 0; int pos = 0; for(;;)< pos = src.find(sub.c_str(),start); if (pos != -1)< start = pos + sub.size(); count++; >else < break; >> return count; >
Рассмотрим каждый момент отдельно. Для поиска подстрок запускаем бесконечный цикл. Это делается т.к. мы не знаем точно сколько вхождений будет. А если бы знали, то и алгоритм нам не нужен был бы. Первым же делом ищем вхождение подстроки в строку. Результат — позиция первого символа подстроки в строке. Т. к. искать начинаем с начала строки, то значение start = 0. Итак, если мы нашли хот одно вхождение, то увеличиваем позицию для начала старта. Приведенная мною формула экономит процессорное время, т.к. пропускает найденную подстроку, и программа в этой части поиск уже не производит. Также мы увеличиваем значение счетчика. И всё! В конце выводим значение счетчика. В следующем посте я приведу НЕСКОЛЬКО быстрых алгоритмов поиска подстроки в строках типа char*.
Все права защищены. Haikson
Найти вхождение подстроки в строку на Си
подскажите пожалуйста: есть два массива символов которые вводятся пользователем, нужно посимвольно их проверить и найти подстроку в строке без использования 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"); >
Ошибка сервера в приложении ‘/’.
Описание: На сервере возникла ошибка приложения. Текущая пользовательская настройка ошибок для этого приложения не позволяет удаленно просматривать сведения об ошибке данного приложения (из соображений безопасности). Однако, сведения можно просматривать в браузерах, запущенных на локальном сервере.
Сведения: Для разрешения просмотра сведений данного сообщения об ошибке на локальном сервере создайте тег в файле конфигурации «web.config», который находится в корневом каталоге текущего веб-приложения. В теге следует задать атрибут «mode» со значением «Off».
Примечания: Отображаемую в данный момент страницу ошибок можно заменить на пользовательскую страницу ошибок, изменив атрибут «defaultRedirect» тега конфигурации приложения таким образом, чтобы он содержал URL-адрес пользовательской страницы ошибок.
Как найти подстроку в строке?
Как в Си, можно найти подстроку в строке, т.е. определить место первого вхождения, желательно с примером.
anonymous
10.11.01 11:32:55 MSK
Re: Как найти подстроку в строке?
char *b = «au new string»;
char *pos = strstr(b, «new»);
if (pos)
<
/*
* do something, string is found and pos is pointer to
* first occurrence
*/
>
take a look at strtok, strchr :))
It just a example:)))
tvn ★
( 10.11.01 14:18:25 MSK )
Re: Как найти подстроку в строке?
Bulash-OFF ★
( 10.11.01 14:37:16 MSK )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Поиск нескольких подстрок в строке (2007)
- Форум Sed (вырезать подстроки из строки) (2012)
- Форум Найти подстроку в строке (2018)
- Форум Вероятность встречи подстроки n раз (2008)
- Форум Как найти подстроку в строке по шаблону? (2020)
- Форум Поиск подстрок в строке (2019)
- Форум Сравнение строк в bash (2003)
- Форум Извлечение подстроки. (2013)
- Форум gcc: подстрока в строке (2005)
- Форум Найти смещение подстроки в блочном устройстве. Как? (2012)