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

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

  • автор:

Строки 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)

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

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