C语言strstr()函数模拟实现和库实现之间的差距
strstr()
的函数原型为char *strstr(const char *haystack, const char *needle)
,用于在字符串 haystack
中查找第一次出现字符串 needle
的位置,注意不包含终止符 ‘\0’。该函数的返回值为在 haystack
中第一次出现 needle
字符串的位置,如果未找到则返回 null
。
下面先贴上自己模拟实现的myStrstr()
,先不看代码中的细节处理,仅关注代码逻辑。在代码编写的过程中,自己的脑海中是有思路的,也能做到将思路以代码的形式展示出来,但是,过一小时之后回过头来再阅读该代码时,发现……比实现时还要难,这就说明当时在写代码时的核心逻辑是不明确的,题目还没想明白,就开始动手写,虽然补补贴贴可以实现,但却事倍功半。
char* myStrstr(const char* str1,const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
int index = 0;
char* ret = str1;
char* tmp = str2;
while(1)
{
if(*str1 == *str2)
{
while(*str1 == *str2)
{
if(!*str2)
{
return ret+index;
}
str1++;
str2++;
}
}
else
{
if(!*str2)
{
return ret+index;
}
if(!*str1)
{
return NULL;
}
str1 = ret + ++index;
str2 = tmp;
}
}
}
int main()
{
char *str1 = "abcc2ccccde";
char *str2 = "cc2c";
char *ret = myStrstr(str1, str2);
printf("%s", ret);
return 0;
}
记录下这次的问题,提醒自己以后在写代码之前,先要把问题的逻辑理清楚,逻辑理清楚了,写代码也就顺利的多了。当然,这个逻辑不应该具体到每一个细节是怎样安排的,而是主题思路,比如在模拟实现strstr()
函数时,理清该问题需要做的主要工作分为(1)被搜索的字符串要向后遍历,(2)要进行两个字符串的匹配,以及二者之间的顺序问题。
下面附上学习完strstr()
库实现后,对上述代码的修改版:
char* myStrstr(char* str1,char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char *s1 = str1;
const char *s2 = str2;
const char *cp = str1;
if(!*str2)
return (char*)str1;
while(*cp) //控制向后遍历
{
s1 = cp;
s2 = str2;
while(*s1 && *s2 && *s1==*s2) //进行匹配
{
s1++;
s2++;
}
if(!*s2)
return (char*)cp;
cp++;
}
return NULL;
}