Mohican_4/14 C语言字符串 朴素(暴力)匹配 strstr strcmp strchr

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

int My_strstr(const char * str, const char * sub)
{
	assert(*str !=NULL);
	assert(*sub !=NULL);
	int i = 0;
	int j = 0;

	while(str[i]!='\0' && sub[j]!='\0')//如果主串和模式串对应位置的值相等,继续比较
	{
		if( str[i] == sub[j] )
		{
			i++;
			j++;
		}
		else    //如果不相等,则模式串需要回朔到第一个字符,而主串则从下一个字符开始
		{
			i = i-j+1;   //上一次匹配的下一个位置 正则表达式 lastindex  ???
			j = 0;
		}
	}
	if( sub[j]=='\0' )  //如果循环是模式串遍历完了而结束的,则说明找到了对应子串的位置
	{
		printf("Successful!\n");
		return i-j+1;
	}
	else        //匹配失败 
	{
		printf("False!\n");
		return false;
	}

}

//c第一次出现的位置 实现strchr
int strchr(const char *str, char c)
{         
	assert(NULL != str);
	int i;
	for(i =1; *str != c;str++&&i++); //i= 1 从第一位开始
	{
		if(*str == '\0')
		{
			return NULL;
		}
	}
	return i;
}

//用my_strchr实现 朴素匹配   有BUG 暂不展示
int My_strchr(const char * str , const char * sub)
{
	int i=0,j=0;
	while(str[i]!='\0')
	{
		if(strchr(&str[i],sub[j])==0)
		{
			i++;
			j++;
		}
		else 
		{
			i++;
			j=0;
		}
	}//有一点问题 暂待修改
}

int My_strncmp(const char * str ,const char * sub)   
{
	int length = strlen(sub);//每次比较的个数就是字符串 sub的长
	int i=0,j=0;
	while(str[i]!='\0' && sub[j]!='\0')
	{
		if(strncmp(&str[i],&sub[j],length)==0)
		{
			return i+1;
		}
		else
		{
			i++;
			j=0;
		}
	}	
}

int main()
{
	char *str1 ="iloveyou ";
	char *sub1 ="ey";
	char a ='o';
	//printf("The %d th.\n", My_strstr(str1,sub1)); //朴素匹配---strstr
	//printf("The %d th\n", Mystrchr(str1,a) ); //朴素匹配单个字符---strstr
	printf("%d",My_strchr(str1,sub1));  //失败
	//printf("the right way is %d\n",My_strncmp(str1,sub1)); 
	getchar();
	return 0;
}


Memcpy 两种算法 暂时先写 不考虑内存重叠版本

/3.memcpy()由s2指定内存区域拷贝count个字符到s1所指定的内存区域。s2和s1内存区域不能重叠,函数返回指向s1的指针。
//3.1.未考虑内存重叠
void * my_memcpy1(void *s1,const void *s2,int count)  
{
	void * ret = s1;
	while (count--)
	{
		*(char *)s1 = *(char *)s2;
		s1 = (char *)s1 + 1;
		s2 = (char *)s2 + 1;
	}
	return(ret);
}

用strcmp和strchr一起实现的

//2.用 strncmp,strchr   (参考杨同学的)
char *My_strstr3(char *s1, char *s2)
{
	assert(s2 != NULL);
	assert(s2 != NULL);
	char ch = *s2;
	int len = strlen(s2);
	while (*s1 != '\0')
	{
		if (strncmp(strchr(s1, ch), s2, len) == 0)
		{
			return strchr(s1, ch);
		}
		else
		{
			s1++;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_39087263/article/details/79993776
今日推荐