Дана символьная строка.Подсчитать сколько раз в ней встречается подслово абба - 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.
- В конце функции, с помощью функции