Ваш подход к написанию strstr
в корне ошибочен. Давайте посмотрим на то, что вы написали:
char const *ret = sub;
int r = 0;
while ( ret = strchr( ret, *sub ) ) {
if ( strcmp( ++ret, sub+1 ) == 0 ){
r = 1;
}
else{
r = 0;
}
}
return r;
Прежде всего, поскольку вы инициализируете ret
для указания на sub
, вы сравниваете sub
с самим собой и никогда не смотрите на s
. Но давайте предположим, что вы хотели инициализировать ret
значением s
...
ret = strchr( ret, *sub )
находит позицию следующего символа sub
в пределах ret
, а затем продвигается ret
, чтобы начать с этого символа.
Затем вы выполняете strcmp( ++ret, sub+1 )
, который определяет, равна ли строка, начинающаяся со следующего символа ret
, строке, начинающейся со следующего символа sub
, а затем продвигается ret
, чтобы начать со следующего символ (независимо от того, был ли тест истинным или ложным).
Очевидно, что эта логика не делает то, что вы хотите. Что он на самом деле сделает, так это определит, равна ли подстрока строке s
или находится в end строки s
и не содержит повторяющихся букв.
Вот общее описание алгоритма, который вы хотите:
- Найти позицию первого символа
sub
в s
. Если не найдено, верните false.
- Обновите
s
, чтобы оно начиналось с этой позиции
- Предполагая, что длина
sub
равна n
, проверьте, совпадают ли первые n
символы s
с sub
(будьте осторожны, чтобы не пропустить конец s
). Если это так, верните истину. В противном случае, передвиньте s
на один символ и выполните цикл.
Обратите внимание, что вы никогда не должны искать какой-либо символ в sub
, кроме первого. Идея состоит в том, чтобы использовать первый символ sub
, чтобы найти потенциал начальных позиций для sub
в s
, а затем проверить, существует ли на самом деле подстрока sub
. Если его там нет, вы хотите сбросить всю сумму s
до этой точки, а затем начать сначала, пытаясь найти следующую потенциальную стартовую позицию.