C语言strstr()函数模拟实现和库实现之间的差距

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;
}

你可能感兴趣的:(C/C++,编程练习栈)