Задать вопрос
@sabotage_kyrazh

Как реализовать функцию, которая ищет подстроку в строке?

Прохожу онлайн курс по с++ и снова встал в ступор. Задание гласит как :

Другая частая задача над строками это поиск подстроки (некоторого слова или сочетания символов) внутри другой строки. Реализуйте функцию, которая ищет заданную подстроку в строке и возвращает позицию ее первого вхождения (помните, что в C++ принято считать начиная с 0), если подстрока найдена, или -1, если такой подстроки нет.

Sample Input:
Hello, world!
ello
Sample Output:
1
Memory Limit: 256 MB
Time Limit: 5 seconds

Решить надо с помощью указателей и массивов.
я пока плохо понимаю С++, нагуглить ничего толкового не получилось.
  • Вопрос задан
  • 3172 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
GavriKos
@GavriKos
Гуглите strcpy implementation. По крайней мере на мысли может какие наведет. Объяснять задачу "на пальцах" человеку с низким знанием с/с++ весьма сложно. Если совсем вкратце:
берете первую букву подстроки, идете по строке, как только нашли букву - начинаете дальше сравнивать поэлементно.
Ответ написан
Комментировать
mezastel
@mezastel
Финансовая математика, программирование
Вообще можно реализовать и парой вложенных for циклов: во внешнем идем по строке, как только находим 1й символ, делаем внутренний цикл в котором проверям что все остальные совпадают.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
нагуглить ничего толкового не получилось

нужно было начать с курса гугления.
Ответ написан
@mamkaololosha
гуглите Алгоритм Кнута — Морриса — Пратта
Ответ написан
@maiq
Набросал функцию (возможно с ошибками), но думаю алгоритм ясен:
int FindPattern(const char* arg_Str, const char* arg_Ptrn)
{
    int StrSz = strlen(arg_Str);
    int PSz = strlen(arg_Ptrn);
    if(StrSz < PSz || StrSz == 0 || PSz == 0)
        return -1;
    for(int StrIt = 0; StrIt <= StrSz - PSz; StrIt++)
    {
        if(arg_Str[StrIt] == arg_Ptrn[0])
        {
            bool IsBad = false;
            for(int PtrnIt = 1; PtrnIt < PSz; PtrnIt++)
                if(arg_Ptrn[PtrnIt] != arg_Str[StrIt + PtrnIt])
                {
                    IsBad = true;
                    break;
                }
            if(!IsBad) return StrIt;
        }
    }

    return -1;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы