模拟实现库函数strstr以及由strstr函数衍生出来的实际问题

●模拟实现库函数char * strstr (char * str1,  char * str2 );

strstr函数本为标准库中的函数。
用来判断字符串str2是否为字符串str1的子串。

通过两个指针分别指向字符串str1的首地址,字符串str2的首地址
来逐个字符一一的比较;
当发现str1中有str2的完整字符串,则返回str2在str1中首次出现的地址
若中间出现不一样。则str2的指针回到str2的首地址,
str1的指针不变动,接着一一比较,直到str1遍历完。
若没有找到,返回NULL
代码如下:

char *my_strstr(char *a,char *b)
{
    
    
	   while(*a)
	{
    
    
		  char *p=b;
		  char *q=a;
		   while(*a==*p&&*p)
		   {
    
    
			a++;
			p++;
		   }
			if(*p=='\0')
			{
    
    
				return q;
			}
			else
			{
    
    
				a++;
			}
     }
	return NULL;
}
int main()
{
    
    
	char a[]="fghasdjkasd";
	char b[]="bnm";
	printf("%s",my_strstr(a,b));
	return 0;
}
///
///

●由库函数char * strstr (char * str1,  char * str2 );
衍生出来的求:在a字符串中寻找所有b字符串的个数
通过两个指针分别指向字符串str1的首地址,字符串str2的首地址
来逐个字符一一的比较;
当发现str1中有str2的完整字符串,则个数加一
若中间出现不一样,则str2的指针回到str2的首地址,
str1的指针不变动,接着一一比较,直到str1遍历完。
int fun(char*a,char*b)
{
    
    
      int k=0;
      char *str;
		while(*a)
	{
    
    
	   	str=b;
		while(*str)
		{
    
    
			if(*a==*str)
			{
    
    
				str++;
			    a++;
			     if(*str=='\0')
			    {
    
    
			    	k++;
			    }
			}
			else
			{
    
    
				 a++;
				 break;
			}		
	    }	
	}
	return k;
}
int main()
{
    
       char a[]="asdfghjklasdfghjkl";
	char b[]="asd";
	int n=0;
    n=fun(a,b);
    printf("%d",n);
	return 0;
}







猜你喜欢

转载自blog.csdn.net/cfk17829572643/article/details/109251000