Дана символьная строка.Подсчитать сколько раз в ней встречается подслово абба - C (СИ)
Формулировка задачи:
Дана символьная строка.Подсчитать сколько раз в ней встречается подслово абба.
В строке аббабба это слово встречается 1 раз а должно быть 2(так препод поросил)как это реализовать?.
Очень прошу всех помочь.
Решение задачи: «Дана символьная строка.Подсчитать сколько раз в ней встречается подслово абба»
textual
Листинг программы
#include <stdio.h> #include <string.h> void NaiveStringMatcher( const char *sub,const char *text) { size_t subLen = strlen(sub); size_t textLen = strlen(text); size_t i, j, counter = 0; printf("Substring:\n"); for ( i = 0; i <= textLen - subLen; i++) { for (j = 0; j < subLen; j++) if (text[i+j] != sub[j]) break; if (j == subLen) { printf("was found at position %zu\n",i); counter++; } } printf("occurs %zu times\n",counter); } int main() { NaiveStringMatcher("abba", "abbabba"); return 0; }
Объяснение кода листинга программы
В данном коде реализована функция NaiveStringMatcher
, которая подсчитывает количество вхождений подстроки sub
в строку text
.
Список действий:
- Вычисление длины подстроки и строки:
- Строка
sub
сохраняется в переменнойsubLen
с помощью функцииstrlen()
. - Строка
text
сохраняется в переменнойtextLen
с помощью функцииstrlen()
.
- Строка
- Поиск вхождений подстроки в строку:
- Переменная
i
инициализируется значением 0, а переменнаяj
- значением 0. Переменнаяcounter
инициализируется значением 0 и будет использоваться для подсчета количества вхождений подстроки. - Строка выводится с помощью функции
printf()
с использованием формата%s
, чтобы указать на то, что будет выводиться строка. - Используется два вложенных цикла. Внешний цикл выполняется до тех пор, пока индекс
i
меньше или равенtextLen - subLen
. Это условие гарантирует, что мы не выйдем за пределы строкиtext
, когда будем сравнивать символы. - Во внутреннем цикле происходит сравнение каждого символа подстроки
sub
со символами строкиtext
. Если символы не совпадают, то условиеif (text[i+j] != sub[j])
становится истинным и цикл прерывается с помощью оператораbreak
. - Если внутренний цикл завершается без прерывания, это означает, что подстрока
sub
найдена в строкеtext
начиная с позицииi
. - В этом случае, с помощью функции
printf()
выводится сообщение, указывающее позицию, на которой найдена подстрока, и значение переменнойcounter
увеличивается на 1.
- Переменная
- Вывод результата:
- В конце функции, с помощью функции
printf()
выводится сообщение, указывающее количество вхождений подстроки. Значение переменнойcounter
используется в качестве аргумента для функцииprintf()
с использованием формата%zu
, чтобы указать на то, что будет выводиться целое число, без знака. В функцииmain()
, подстрокаabba
и строкаabbabba
передаются в качестве аргументов функцииNaiveStringMatcher
.
- В конце функции, с помощью функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д