Создать подобную функцию strstr - C (СИ)
Формулировка задачи:
Вообщем мой преподователь дал мне задание: создать подобную функцию strstr, чтобы моя функция my_strstr работала также.
Есть ряд тестов которые он мне составил, результат должен быть одинаковый, как в случае функции strstr так и в моей my_strstr.
ЗАДАЧА:доделать прогу так, чтобы my_strstr работала также как и функция strstr.
ВОТ И САМА ПРОГА ТЕСТ:
#include <stdio.h>
#include <string.h>
char *my_strstr(const char *haystack, const char *needle)
{
return NULL;
}
void analyze(const char *r)
{
if (r == NULL)
printf("NULL\n");
else
printf("%s\n", r);
}
int main(int argc, char *argv[])
{
printf("1.\n");
analyze(strstr("Hello world !!!", "llo w"));
analyze(my_strstr("Hello world !!!", "llo w"));
printf("2.\n");
analyze(strstr("Hello world !!!", "llu w"));
analyze(my_strstr("Hello world !!!", "llu w"));
printf("3.\n");
analyze(strstr("Hello world !!!", "Hello world !!!"));
analyze(my_strstr("Hello world !!!", "Hello world !!!"));
printf("4.\n");
analyze(strstr("Hello world !!!", "H"));
analyze(my_strstr("Hello world !!!", "H"));
printf("5.\n");
analyze(strstr("Hello world !!!", "d"));
analyze(my_strstr("Hello world !!!", "d"));
scanf("%*c");
return 0;
}Решение задачи: «Создать подобную функцию strstr»
textual
Листинг программы
char *my_strstr(const char *haystack, const char *needle)
{
const char *temp, *c;
temp = needle;
while (*haystack)
{
c = haystack;
while(*(haystack++) == *(needle++))
{
if (!(*needle))
{
return (char*)c;
}
if(!(*haystack))
{
return NULL;
}
}
needle = temp;
}
return NULL;
}
Объяснение кода листинга программы
Создана функция my_strstr, которая ищет первое вхождение подстроки needle в строке haystack.
- Первый аргумент функции — haystack, это строка, в которой мы ищем подстроку.
- Второй аргумент функции — needle, это подстрока, которую мы ищем в haystack.
- В функции создаются две константные указатели temp и c, которые будут использоваться для временного хранения значений.
- Указатель temp инициализируется значением needle, чтобы в случае, если подстрока не найдена, можно было начать поиск с начала подстроки.
- В цикле while проверяется, не является ли текущий символ в haystack нулевым символом. Если это так, то мы достигли конца строки haystack и должны вернуть NULL.
- Если текущий символ в haystack не равен нулю, то мы переходим к следующему символу в haystack.
- В цикле while проверяется, совпадает ли текущий символ в haystack с текущим символом в needle. Если это так, то мы переходим к следующему символу в обоих строках.
- Если текущий символ в haystack не равен текущему символу в needle, то мы выходим из внутреннего цикла и переходим к следующей итерации внешнего цикла.
- Если мы достигли конца подстроки needle, то мы возвращаем указатель на первое вхождение подстроки needle в haystack.
- Если мы достигли конца строки haystack или не нашли подстроку needle, то мы возвращаем NULL.
- Функция возвращает найденную подстроку в виде указателя на первый символ подстроки в haystack. Если подстрока не найдена, то возвращается NULL.