strstr和memcmp函数的实现

#include <stdio.h>

#include <stdlib.h>			//malloc()函数

typedef unsigned int size_t;



size_t my_strlen(const char * str)

{

	const char *sc = NULL;

	if(str == NULL)

		return 0;

	for(sc = str;*sc != '\0';sc++)

	{

		/*  do nothing */

	}				

	return sc - str;

}



/*  因为类型可以为任意,所以形参应为void *

 *  相等则返回0,否则不为0

 */

int my_memcmp(const void *s1,const void *s2,size_t count)

{

	int res = 0;

	const unsigned char *p1 =(const unsigned char *)s1;//注意是unsigned char *

	const unsigned char *p2 =(const unsigned char *)s2;	

	for(p1 ,p2;count > 0;p1++,p2++,count--)

		if((res =*p1 - *p2) != 0)	//不相当则结束比较

			break;

	return res;

}

/* 查找字符串s2是否为s1的子串,s1为主串

 * 如果是则返回从第一个子串开始的字符串 

 */

char * my_strstr(const char *s1,const char *s2)

{

	int len1,len2;

	len2 = my_strlen(s2);	//获取子串s2的长度

	if(!len2)				//如果子串s2为空则返回s1

		return (char *)s1;	//先强制类型转换

	len1 = my_strlen(s1);	//获取子串s1的长度

	while(len1 >= len2)

	{

		len1--;

		if(!my_memcmp(s1,s2,len2)) //my_memcmp返回0表示s1中存在s2的子串

			return (char *)s1;	   //先强制类型转换

		s1++;

	}

	return NULL;	//len1 < len2时返回空

}



int main()

{

	printf("%s\n",my_strstr("hello world","world"));

	printf("%s\n",my_strstr("hello world","e"));

	printf("%s\n",my_strstr("hello world","llo"));

    return 0;

}

执行结果:

strstr和memcmp函数的实现


2013年10月10日17:23分补充下面算法

不使用库函数来实现strstr函数,效率其实也不高,高效率应该使用KMP法

 

#include <stdio.h>



char* strstr(char* buf, char* sub)

{

	char* bp;

	char* sp;

	if(sub == NULL)

		return  buf;

	while(buf !=NULL)

	{

		bp=buf;

		sp=sub;

		do{ 

			if(!*sp)		//sp到最后即sub到最后则返回第一个子串在主串的位置

				return buf;

		}while(*bp++ == *sp++);

		buf++;				//如果不等,主串buf+1,子串回溯到0

	}

	return 0;

}



int main()

{

	printf("%s\n",strstr("hello world", "ell"));

    return 0;

}

执行结果:

 



 

你可能感兴趣的:(函数)