Правильный подход заключается в создании ваших тестовых случаев (желательно сначала, на мой взгляд, но это не является абсолютно необходимым).Создайте модульные тесты для успешных и неуспешных случаев, включая любые сложные случаи.
И еще одно предложение - использовать достойные имена переменных.Многословие не делает ваш скомпилированный код медленнее, но делает намного более удобочитаемым и поддерживаемым.
Я бы, вероятно, также использовал индексы вместо указателей.Не потому, что я их не понимаю, просто потому, что я часто нахожу, что они способствуют удобочитаемости, и приличные компиляторы генерируют один и тот же код под обложками.
Предлагаемые тестовые примеры (для начала):
- успешный поиск в начале строки.
- успешный поиск в середине строки.
- успешный поиск в конце строки.
- строка не найдена.
- большая часть найденной строки.
- с передачей значения NULL в качестве любого аргумента.
- пустых строк в качестве аргументов.
Судя по вашемукод, кажется, вы пытаетесь скопировать строку в другое место (возможно, завершается нулем), а затем вернуть адрес , что .Это не совсем то, как работает ISO strstr
.Он просто возвращает местоположение первого байта в строке содержимого , которая соответствует строке поиска.
Таким образом, упрощенная реализация (минимальная оптимизация, даже если приличный компилятор, вероятно, все равно обработает большую часть этого)) может быть простым:
#include <stdio.h>
#include <string.h>
char * fstrstr (char *needle, char *haystack) {
int nlen, npos, hlen, hpos, hpos2;
// If length of needle is 0, it's defined as found at start.
if (*needle == 0) {
return haystack;
}
// Ensure strlen only calculated once.
nlen = strlen (needle);
hlen = strlen (haystack);
// Check every possible position in haystack.
for (hpos = 0; hpos < hlen - nlen+1; hpos++) {
// Check each character, ensuring common subexpression elimination.
for (npos = 0, hpos2 = hpos; npos < nlen; npos++, hpos2++) {
// No match, break early.
if (needle[npos] != haystack[hpos2]) {
break;
}
}
// No early break, we found a match.
if (npos == nlen) {
return &(haystack[hpos]);
}
}
// No match anywhere, return NULL.
return NULL;
}
static char *xlat(char *p) {
if (p == NULL) return "NULL";
return p;
}
int main (void) {
printf ("%s\n", xlat(fstrstr ("hel","hello world")));
printf ("%s\n", xlat(fstrstr ("el","hello world")));
printf ("%s\n", xlat(fstrstr ("orl","hello world")));
printf ("%s\n", xlat(fstrstr ("rld","hello world")));
printf ("%s\n", xlat(fstrstr ("d","hello world")));
printf ("%s\n", xlat(fstrstr ("","hello world")));
printf ("%s\n", xlat(fstrstr ("xyz","hello world")));
printf ("%s\n", xlat(fstrstr ("xyz","")));
return 0;
}
, который выводит:
hello world
ello world
orld
rld
d
hello world
NULL
NULL
Обратите внимание, что это включает в себя некоторые модульные тесты, я не тщательно проверил его, ноэто должно быть хорошей отправной точкой.