On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 26.09.14 20:21. Заголовок: Ошибка в логике функции поиска подстроки в строке


http://stackoverflow.com/questions/26064062/how-return-position-of-pointer-in-function-of-searching-substrings-in-strings
Что бы не дублировать вопрос - вставил ссылку)
Влад, спасибо за решение, но немогли бы вы помочь мне реанимировать мой код) Просто очень хочется разобраться. Там где-то ошибка в логике(((
На данный момент, с учётом подсказок имеется такой код:

int strstr(const char *str, const char *pattern) { 
const char *st = str;
const char *pa = pattern;
while (*st){
++st;
if( *st == *pa){
char i = 0;
for(;*st == *pa;i++){
++st;
++pa;

}
if(*pa == 0){
return (st-i)-str;
}
pa-=i;
st-=i;
}
}
return -1;
}

Если на вход подавать:
char a[] = "Helloworld!";
char b[] = "ld!";
То возвращается - 1.
А если:
char a[] = "world!";
char b[] = "ld!";
То возвращается 3. Т.е. правильное предпологаемое значение.

Получается, что как только происходит совпадение по символу, а последующие символы не равны, то функция не отрабатывает предполагаемое значение.
Пробывал проверять итеративно на листочке с бумагой, вроде всё должно быть верно, но код почему-то не работает(( Где я ошибся?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 6 [только новые]





ссылка на сообщение  Отправлено: 26.09.14 20:28. Заголовок: О) уже на стаке отве..


О) уже на стаке ответили) Оказывается ошибка была в цикле for
Надо было сделать так.
for(i;*st == *pa && *st;i++)

Влад, в любом случае большо вам спасибо за ваш вариант решения) Буду его разбирать, когда пойму свою ошибку.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 26.09.14 20:38. Заголовок: Как я уже писал на w..


Как я уже писал на www.stackoverflow.com вы по крайней мере не должны увеличивать переменную st в начале цикла while

 
while (*st){
++st;


Иначе вы пропускаете первый символ исходной строки.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 26.09.14 20:46. Заголовок: Другая логическая ош..


Другая логическая ошибка кроется в цикле for с последующей проверкой
 
for(;*st == *pa;i++){
++st;
++pa;

}
if(*pa == 0){


Допустим, что две строки полностью совпадают. Тогда цикла for будет выполняться до тех пор, пока строки перестанут совпадать. Последние совпадающие символы - это завершающие нули. Когда они совпали, вы тем не менее увеличили pa. В итоге условие if(*pa == 0) не будет выполнено.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 26.09.14 21:18. Заголовок: Помимо того решения,..


Помимо того решения, которое я показал на www.stackoverflow.com, вашу функцию можно подправить следующим образом, максимально сохранив ваш код

 
#include <iostream>

int strstr( const char *str, const char *pattern )
{
for ( const char *st = str; *st; ++st )
{
const char *pa = pattern;

if ( *st == *pa )
{
size_t i = 0;
for( ; *st == *pa && *pa; i++ )
{
++st;
++pa;
}

st -= i;

if ( *pa == 0 )
{
return ( st - str );
}
}
}

return -1;
}

int main()
{
const char *a= "Helloworld!";
const char *b= "ld!";

std::cout << strstr( a, b ) << std::endl;

a = "world!";
b = "ld!";

std::cout << strstr( a, b ) << std::endl;

return 0;
}


Вывод на консоль будет

8
3


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 26.09.14 21:21. Заголовок: Сыроежка пишет: Ина..


Сыроежка пишет:

 цитата:
Иначе вы пропускаете первый символ исходной строки.


точно) И это тоже) В тест кейсах видимо не было такой ситуации, где искомая строка начинается в самом начале.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 26.09.14 21:23. Заголовок: Сыроежка пишет: Доп..


Сыроежка пишет:

 цитата:
Допустим, что две строки полностью совпадают. Тогда цикла for будет выполняться до тех пор, пока строки перестанут совпадать. Последние совпадающие символы - это завершающие нули. Когда они совпали, вы тем не менее увеличили pa. В итоге условие if(*pa == 0) не будет выполнено.


а тут я думал, что false == false будет false)

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 9
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет