Форум » C/C++ для начинающих (C/C++ for beginners) » Ошибка в логике функции поиска подстроки в строке » Ответить

Ошибка в логике функции поиска подстроки в строке

evsign: http://stackoverflow.com/questions/26064062/how-return-position-of-pointer-in-function-of-searching-substrings-in-strings Что бы не дублировать вопрос - вставил ссылку) Влад, спасибо за решение, но немогли бы вы помочь мне реанимировать мой код) Просто очень хочется разобраться. Там где-то ошибка в логике((( На данный момент, с учётом подсказок имеется такой код: [pre2]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; } [/pre2] Если на вход подавать: char a[] = "Helloworld!"; char b[] = "ld!"; То возвращается - 1. А если: char a[] = "world!"; char b[] = "ld!"; То возвращается 3. Т.е. правильное предпологаемое значение. Получается, что как только происходит совпадение по символу, а последующие символы не равны, то функция не отрабатывает предполагаемое значение. Пробывал проверять итеративно на листочке с бумагой, вроде всё должно быть верно, но код почему-то не работает(( Где я ошибся?

Ответов - 6

evsign: О) уже на стаке ответили) Оказывается ошибка была в цикле for Надо было сделать так. for(i;*st == *pa && *st;i++) Влад, в любом случае большо вам спасибо за ваш вариант решения) Буду его разбирать, когда пойму свою ошибку.

Сыроежка: Как я уже писал на www.stackoverflow.com вы по крайней мере не должны увеличивать переменную st в начале цикла while [pre2] while (*st){ ++st; [/pre2] Иначе вы пропускаете первый символ исходной строки.

Сыроежка: Другая логическая ошибка кроется в цикле for с последующей проверкой [pre2] for(;*st == *pa;i++){ ++st; ++pa; } if(*pa == 0){ [/pre2] Допустим, что две строки полностью совпадают. Тогда цикла for будет выполняться до тех пор, пока строки перестанут совпадать. Последние совпадающие символы - это завершающие нули. Когда они совпали, вы тем не менее увеличили pa. В итоге условие if(*pa == 0) не будет выполнено.


Сыроежка: Помимо того решения, которое я показал на www.stackoverflow.com, вашу функцию можно подправить следующим образом, максимально сохранив ваш код [pre2] #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; } [/pre2] Вывод на консоль будет 8 3

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

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



полная версия страницы