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

Как найти подстроку в строке 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"); >

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

Функция find() возвращает индекс первого вхождения подстроки или отдельного символа в строке в виде значние я типа size_t :

#include #include int main() < std::string text ; std::cout 

Если строка или символ не найдены (как в примере выше в последнем случае), то возвращается специальная константа std::string::npos , которая представляет очень большое число (как видно из примера, число 18446744073709551615). И при поиске мы можем проверять результат функции find() на равенство этой константе:

if (text.find("banana") == std::string::npos)

Функция find имеет ряд дополнительных версий. Так, с помощью второго параметра мы можем указать индекс, с которого надо вести поиск:

#include #include int main() < std::string text ; // поиск с 10-го индекса std::cout 

Используя эту версию, мы можем написать программу для поиска количества вхождений строки в тексте, то есть выяснить, сколько раз строка встречается в тексте:

#include #include int main() < std::string text ; std::string word ; unsigned count<>; // количество вхождений for (unsigned i <>; i std::cout 

Здесь в цикле пробегаемся по тексту, в котором надо найти строку, пока счетчик i не будет равен text.length() - word.length() . С помощью функции find() получаем индекс первого вхождения слова в тексте, начиная с индекса i. Если таких вхождений не найдено, то выходим из цикла. Если же найден индекс, то счетчик i получает индекс, следующий за индексом найденного вхождения.

В итоге, поскольку искомое слово "friend" встречается в тексте два раза, то программа выведет

The word is found 2 times.

В качестве альтернативы мы могли бы использовать цикл while :

#include #include int main() < std::string text ; std::string word ; unsigned count<>; // количество вхождений size_t index<>; // начальный индекс while ((index = text.find(word, index)) != std::string::npos) < ++count; index += word.length(); // перемещаем индекс на позицию после завершения слова в тексте >std::cout

Еще одна версия позволяет искать в тексте не всю строку, а только ее часть. Для этого в качестве третьего параметра передается количество символов из искомой строки, которые программа будет искать в тексте:

#include #include int main() < std::string text ; std::string word ; // поиск с 10-го индекса 3 первых символов слова "endless", то есть "end" std::cout 

Стоит отметить, что в этом случае искомая строка должна представлять строковый литерал или строку в С-стиле (например, символьный массив с концевым нулевым байтом).

Функция rfind. Поиск в обратном порядке

Функция rfind() работает аналогично функции find() , принимает те же самые параметры, только ищет подстроку в обратном порядке - с конца строки:

#include #include int main() < std::string text ; std::cout 

Поиск любого из набора символов

Пара функций - find_first_of() и find_last_of() позволяют найти соответственно первый и последний индекс любого из набора символов:

#include #include int main() < std::string text ; std::string letters; // искомые символы std::cout 

В данном случае ищем в строке "Phone number: +23415678901" первую и последнюю позицию любого из символов из строки "0123456789". То есть таким образом мы найдем начальный и конечный индекс номера телефона.

Если нам, наоборот, надо найти позиции символов, которые НЕ представляют любой символ из набора, то мы можем использовать функции find_first_not_of() (первая позиция) и find_last_not_of() (последняя позиция):

#include #include int main() < std::string text ; std::string letters; // искомые символы std::cout 

Мы можем комбинировать функции. Например, найдем количество слов в строке:

#include #include int main() < std::string text ; // исходный текст const std::string separators< " ,;:.\"!?'*\n" >; // разделители слов unsigned count<>; // счетчик слов size_t start < text.find_first_not_of(separators) >; // начальный индекс первого слова while (start != std::string::npos) // если нашли слово < // увеличиваем счетчик слов count++; size_t end = text.find_first_of(separators, start + 1); // находим, где кончается слово if (end == std::string::npos) < end = text.length(); >start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start > // выводим количество слов std::cout 

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

const std::string separators< " ,;:.\"!?'*\n" >; // разделители слов

Перед обработкой введенного текста фиксируем индекс первого символа первого слова в тексте. Для этого применяется функция find_first_not_of() , которая возвращает первый индекс любого символа, который не входит в строку separators:

size_t start < text.find_first_not_of(separators) >;

Далее в цикле while смотрим, является ли полученный индекс действительным индексом:

while (start != std::string::npos)

Например, если в строке одни только символы из набора separators, тогда функция find_first_not_of() возвратит значение std::string::npos , что будет означать, что в тексте больше нет непунктационных знаков.

И если start указывает на действительный индекс начала слова, то увеличиваем счетчик слово. Далее находим индекс первого символа из separators, который идет сразу после слова. То есть фактически это индекс после последнего символа слова, который помещаем в переменную end:

size_t end = text.find_first_of(separators, start + 1); // находим, где закончилось слово

Для нахождения позиции окончания слова используем функцию find_first_of() , которая возвращает первую позицию любого символа из separators, начиная с индекса start+1

Причем может быть, что функция find_first_of() не найдет ни одного символа из separators (например, слово является поседним в тексте, и после него нет никаких знаков пунктуации или пробелов), в этом случае конечный индекс равен длине текста.

if (end == std::string::npos) // если НЕ найден ни один из символов-разделителей end = text.length(); // устанавливаем переменную end на конец текста

После того, как мы нашли начальный индексы слова и его конец, переустанавливаем start на начальный индекс следующего слова и повторяем действия цикла:

start = text.find_first_not_of(separators, end + 1); // находим начальный индекс следующего слова и переустанавливаем start

В конце выводим количество найденных слов.

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

В этом посте мы обсудим, как найти все вхождения подстроки в строку на C++.

1. Использование string::find

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

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

Поиск подстроки внутри данной строки, замена найденной подстроки на другую строку
Выполнить поиск подстроки внутри данной строки,замену найденной подстроки на другую строку Пример.

Поиск вхождения подстроки в тексте
Всем привет! Ребята помогите пожалуйста очень нужна помощь. Есть поле Memo в нем есть некий.

Поиск подстроки в тексте и её удаление
Составить программу, ищущую в тексте подстроку «ха» и удаляющую каждую «находку». Помогите.

Поиск подстроки в тексте, который состоит из более чем 200 000 символов
имеется строка (в string) длиной около 200к символов подскажите каким лучше образов искать в этой.

577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
У меня оно выглядит так.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include #include #define MAXLINE 1000 //максимальный размер строки #define MAXPATTERN 100 //максимальный размер подстроки int getline(char s[], int lim); int strindex(char s[], char t[]); int main() { char line[MAXLINE], pattern[MAXPATTERN]; int index; printf("Vvedite stroku: "); getline(line, MAXLINE); printf("Vvedite podstroku: "); getline(pattern, MAXPATTERN); if((index = strindex(line, pattern)) >= 0) printf("Index = %d\n", index); else printf("\nSovpadeniy net!\n"); getche(); return 0; } /* считывает строку */ int getline(char s[], int lim) { int c, i = 0; while(ilim-1 && (c=getchar())!='\n') s[i++] = c; if(c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* находит место t в s или возвращает -1, если t нет в s */ int strindex(char s[], char t[]) { int i, j, k; for(i=0; s[i]!='\0'; i++) { for(j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++) ; if(k>0 && t[k]=='\0') return i; } return -1; }

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

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