C语言strstr函数实现

strstr

这个函数的作用是找出给定子串在给定母串中第一次出现的位置

原型

const char * strstr ( const char * str1, const char * str2 );

这就有必要好好分析一下,如果要查找BAC在字符串ABBBACD中的出现位置,首先应该放两个指针分别对应子串和母串

C语言strstr函数实现_第1张图片

通过遍历字符串,一一进行比较,但是这里会出现问题,一一进行比较必然会让指针移位,而s2只需要在每次比完发现不存在后再次从头比较,而s1却是要在前一次的地方之后开始比较,如图

C语言strstr函数实现_第2张图片

上述中1是本来开始判断子串的出现位置,结果1的位置并不是子串的出现位置 ,因此要让1的位置到2的位置去,所以应该还需要有一个cur变量时刻保存可能的子串出现位置

C语言strstr函数实现_第3张图片
每次循环将cur所指赋给s1,并让str2的开头赋给s2.

C语言strstr函数实现_第4张图片
如果不等于,就让cur往后走,同时,让s1从cur的位置继续开始判断

C语言strstr函数实现_第5张图片
C语言strstr函数实现_第6张图片

如果说s2指到了\0,也就是结尾,说明找到了子串的开始位置

分析完毕,那么来看代码

char* my_strstr(const char* str1,const char *str2)
{
	assert(str1);
	assert(str2);
	char *s1=NULL;
	char *s2=NULL;
	char *cur=str1;
	
	//如果子串一开始就是空,那么直接返回母串 
	if(*str2=='\0')
	{
		return *str1;
	}
	
	while(*cur!='\0')
	{
		s1=cur;
		s2=str2;
		while(*s1==*s2)
		{
			s1++;
			s2++;
		}
		
		if(*s2=='\0')
		{
			return cur;
		}
		
		cur++;
	}
	
	return NULL;
	
}

这看样子是实现了,但是如果把实例换成ABBBAC和BAC,那么这个程序就会出问题。

仔细观察后发现,如果当s1和s2同时走完,满足s2=’\0’的情况,但是s1和s2后面全部都是\0,那么它们就会一直相等下去,直到永远…
所以,还需要给定一个s1和s2都不能等于0,s1和s2才能一起走下去的条件

char* my_strstr(const char* str1,const char *str2)
{
	assert(str1);
	assert(str2);
	char *s1=NULL;
	char *s2=NULL;
	char *cur=str1;
	
	//如果子串一开始就是空,那么直接返回母串 
	if(*str2=='\0')
	{
		return *str1;
	}
	
	while(*cur!='\0')
	{
		s1=cur;
		s2=str2;
		while((*s1==*s2)&&*s1&&*s2)//s1和s2不能走到\0 
		{
			s1++;
			s2++;
		}
		
		if(*s2=='\0')
		{
			return cur;
		}
		
		cur++;
	}
	
	return NULL;
	
}

至此,函数完成

你可能感兴趣的:(css,1024程序员节,c语言)