#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* p1 , const char* p2) {
assert(p1 != NULL);
assert(p2 != NULL);
char* s1 = p1;
char* s2 = p2;
char* current = p1;
if (*p2 == '\0') {
return p1;
}
while (*current) {
s1 = current;
s2 = p2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {
return current;
}
current++;
}
}
int main() {
char* p1 = "abcccde";
char* p2 = "ccde";
char* ret = my_strstr(p1,p2);
printf("%s \n" , ret);
return 0;
}
上面的代码有些冗余,尝试优化了一下:
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* p1 , const char* p2) {
assert(p1 != NULL);
assert(p2 != NULL);
char* s1;
char* s2;
char* current = p1;
if (!*p2) {
return current;
}
while (*current) {
s1 = current;
s2 = p2;
while (*s1 && *s2 && !(*s1 - *s2)) {
s1++;
s2++;
}
if (!*s2) {
return current;
}
current++;
}
}
int main() {
char* p1 = "abccccccdeeeee";
char* p2 = "ccde";
char* ret = my_strstr(p1,p2);
printf("%s \n" , ret);
return 0;
}
以上代码不足的是警告没有进行压制,并且 s2 的长度大于 s1 长度的时候会空跑
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* p1 , const char* p2) {
assert(p1 != NULL);
assert(p2 != NULL);
char* s1;
char* s2;
char* current = (char*)p1;
if (!*p2) {
return current;
}
while (*current) {
s1 = current;
s2 = (char*)p2;
while (*s1 && *s2 && !(*s1 - *s2)) {
s1++;
s2++;
}
if (!*s2) {
return current;
}
if (!*s1) {
return NULL;
}
current++;
}
return NULL;
}
int main() {
char* p1 = "abccccccdeeeee";
char* p2 = "ccde";
char* ret = my_strstr(p1,p2);
printf("%s \n" , ret);
return 0;
}