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

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

Подскажите пожалуйста как доделать функцию.
Было дано задание изобрести свой костыль) Функцию, которая искала бы подстроку в строке и возвращала позицию её первого вхождения.
Вот мой код, что получился:
int strstr(const char *str, const char *pattern) {
    const char *st = str; // присваеваем указателю адрес строки
    const char *pa = pattern; //присваеваем указателю адресс паттерна, который будем искать в строке
    while (*st){ // начинаем пробегаться по каждой ячейке строки
        ++st;
        if( *st == *pa){ //как только находит символ в строке, который равен первому символу паттерна запускаем цикл
            int i = 0; //счётчик итераций, что бы можно было вернуть указатель строки на исходное место
            for(i;*st == *pa;i++){ //этим циклом пробегаемся по следующим символам строки и паттерна и проверяем их равенство
                ++st;
                ++pa;
            } //цикл завершится когда либо паттерн достигнет конца, либо строка. или какие-либо последующие символы не равны
 
            if(*pa == 0){ //если паттерн достиг конца, то получаем позицию вхождения
                return st-i; //вот тут не компилируется((
            }
 
            pa-i; //сбрасываем паттерн на исходное положение
            st-i; // сбрасываем строку на исходное положение
        }
    }
    return -1; //возвращаем -1, если подстрока не была найдена
}


Проблема в том, что он не компилируется, т.к. от char нельзя отнимать int. Какого типа сделать i, что бы можно было его отнять от char?
char i = 0; пробывал. Ошибка почему-то происходит такая же. invalid conversion from ‘const char*’ to ‘int’
И проверьте пожалуйста мою логику)) Всё ли верно?)
  • Вопрос задан
  • 2802 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@Lol4t0
st - i - это указатель на начало совпадающей части строк. Если вам нужно позицию первого вхождения, то нужно ее вычислить, как разницу указателя начала исходной строки и указателя на начало совпадающей части.

Кроме того

1) Вот это вот явно не то, что вы хотите (и не то, что написано в комментарии)
pa-i; //сбрасываем паттерн на исходное положение
st-i; // сбрасываем строку на исходное положение


2) Почитайте про алгоритмы нахождения подстроки в строке
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@drozdVadym
Вы все задачи с https://stepic.org/ будете так решать?
Ответ написан
Ваш ответ на вопрос

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

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