通过对C的库函数strstr的实现,可以加深对字符串和指针的理解。
函数定义:
char * strstr (const char *s1, const char *s2)
我们很容易就可以想到一个嵌套循环查找:
- 版本一:
外层循环用于定位在是s1中的查找起点,当内侧循环未完全匹配的时候,外侧循环的指针就后移一位,再次通过内侧循环测试。
而内层循环一旦对应相等则不断比较测试后面的字符,直到s2子串的尾部,如果p2到达尾部说明完全相等。内层循环如果发现有不等的字符就跳出内层循环重新从s1的下一位开始比较。
#define NUL '\0'
char *my_strstr(char const * s1, char const *s2) {
if (*s2 == NUL)
return s1;
while(*s1 != NUL) {
char * p1 = s1;
char * p2 = s2;
while(*p2 != NUL) {
printf("p1: %c, p2: %c \n", *p1, *p2);
if (*p2 == *p1) {
p2++;
p1++;
} else {
break;
}
}
if (*p2 == NUL) { return s1;}
s1++;
}