考虑到代码行数,运行效率,优雅与美观等因素,实现如下:
char *my_strstr(char *s1, char *s2)
{
char *p1, *p2;
for (p1 = s1, p2 = s2; *p1 && *p2; p1++) {
if (*p1 == *p2)
p2++;
else if (p2 != s2)
p2 = s2;
}
if (!*p2)
return p1 - (p2 - s2);
return NULL;
}
测试代码如下:
#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
int main()
{
char *testData[][3] = {
{"12345", "34", "345"},
{"12345", "345", "345"},
{"12345", "12", "12345"},
{"12345", "334", NULL}
};
int i, ok;
char *p;
for (i = 0; i < ARRAY_SIZE(testData); i++) {
p = my_strstr(testData[i][0], testData[i][1]);
if (!p) {
ok = (p == testData[i][3]);
} else {
ok = (!strcmp(p, testData[i][2]));
}
printf("test %d: %s\n", i, ok ? "ok" : "fail");
}
return 0;
}
运行地址点这里。