Определение последнего вхождения подстроки в строку - C (СИ)
Формулировка задачи:
Написать следующие функции в двух вариантах: с использованием индексов и указателей.
В строке string1 определяет последнее вхождение в нее строки string2. Возвращает указатель на начало вхождения. В случае неуспеха возвращается -1.
const char* rat(const char* string1, const char* string2)
Функции типа strstr использовать НЕЛЬЗЯ!
С комментариями, пожалуйста!
Решение задачи: «Определение последнего вхождения подстроки в строку»
textual
Листинг программы
- #include <stdio.h>
- char* strrstr(const char* const haystack, const char* const needle)
- {
- int flag = 0;
- const char* haystackIterator = haystack;
- const char* haystackSearchStartPtr = NULL;
- const char* needleIterator = needle;
- size_t needleLength = 0;
- /* empty needle case */
- if (*needle == '\0')
- {
- return NULL;
- }
- /*
- here we do the following:
- 1) sending needle iterator to the end of needle
- 2) getting needle end pointer from #1
- 3) while going to end pointer, determine if both strings are same
- (only if they are of same length that is)
- 4) check if we can actually perform a search -- haystack can be shorter
- than needle
- */
- flag = 1;
- while ((*needleIterator != '\0') && (*haystackIterator != '\0'))
- {
- if (*needleIterator != *haystackIterator)
- {
- flag = 0;
- }
- needleIterator++;
- haystackIterator++;
- }
- /* checking if needle is longer than haystack */
- if (*needleIterator != '\0')
- {
- return NULL;
- }
- /*
- checking if both are of same length and had same character composition
- the whole time
- */
- if (flag && (*needleIterator == '\0') && (*haystackIterator == '\0'))
- {
- return (char*) haystack;
- }
- needleLength = needleIterator - needle;
- /* sending haystack iterator to (end of haystack - needle length) position */
- while (*(haystackIterator + needleLength) != '\0')
- {
- haystackIterator++;
- }
- /* starting search from end */
- haystackSearchStartPtr = haystackIterator;
- while (haystackSearchStartPtr >= haystack)
- {
- /* iterating through both, comparing at the same time */
- needleIterator = needle;
- haystackIterator = haystackSearchStartPtr;
- while ((*needleIterator != '\0') && (*needleIterator == *haystackIterator))
- {
- haystackIterator++;
- needleIterator++;
- }
- /* if we reached end of needle, then we had positively compared both */
- if (*needleIterator == '\0')
- {
- return (char*) haystackSearchStartPtr;
- }
- haystackSearchStartPtr--;
- }
- return NULL;
- }
- void Test(void)
- {
- printf("'%s'\n", strrstr("This is a test string!", "string"));
- printf("'%s'\n", strrstr("This is a test string!", "This"));
- printf("'%s'\n", strrstr("This is a test string!", "DEMO"));
- printf("'%s'\n", strrstr("This is a test string!", "st"));
- printf("'%s'\n", strrstr("This is a test string!", "This is a test string!"));
- printf("'%s'\n", strrstr("This is a test string!", ""));
- }
- int main(void)
- {
- Test();
- return 0;
- }
Объяснение кода листинга программы
- В функции
strrstr
определяется последний вхождения подстроки в строку. - Если подстрока пустая, то возвращается
NULL
. - Переменная
flag
инициализируется как 1. - В цикле пока оба указателя не достигнут конца своих строк, выполняется сравнение символов.
- Если символы не совпадают, то значение переменной
flag
меняется на 0. - Если подстрока длиннее строки, то возвращается
NULL
. - Если подстрока и строка имеют одинаковую длину и состав, то возвращается адрес последнего символа строки.
- Если подстрока короче строки, то выполняется поиск с начала строки.
- Если подстрока найдена, то возвращается адрес первого символа подстроки.
- В функции
Test
выводятся результаты тестирования функцииstrrstr
. - В строке
This is a test string!
подстрокиstring
,This
,DEMO
,st
иThis is a test string!
находятся в конце строки. - Подстрока
This is a test string!
находится в начале строки. - Подстрока `` не найдена в строке.
- В функции
main
вызывается функцияTest
. - Программа завершается с возвращаемым значением 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д