c++中strstr函數的幾種實現方法

函數說明:
包含文件:string.h
函數名: strstr
函數原型:extern char *strstr(char *str1, char *str2);
功能:從字符串str1中查找是否有字符串str2, 如果有,從str1中的str2位置起,返回str1的指針,如果沒有,返回null。
返回值:返回該位置的指針,如找不到,返回空指針。
方法一:
#include <iostream>
#include <assert.h>
using namespace std;

char* My_strstr(char *src,char *substr)
{
	assert(src != NULL && substr != NULL);

	unsigned int size = strlen(src);
	for(int i = 0; i < size; ++i,++src)
	{
		char *p = src;
		for(char *q = substr;;p++,q++)
		{
			if(*q == '\0')   //在src中找到連續的substr子串停止並返回
			{
				return src;
			}
			if(*q != *p)
			{
				break;
			}
		}
	}

	return NULL;
}

int main()
{
	char *res = My_strstr("abcdefg","cde");
	if(res != NULL)
	{
		cout<<"exist:"<<res<<endl;
	}
	else
	{
		cout<<"no exist!"<<endl;
	}
	return 0;
}


方法二:
#include <iostream>
#include <assert.h>
using namespace std;
char* My_strstr(const char* s1,const char* s2)
{
	int n;
	if(*s2)
	{
		while(*s1)
		{
			for(n=0;*(s1+n)==*(s2+n);n++)
			{
				if(!*(s2+n+1))
					return (char*)s1;
			}
			s1++;
		}
		return NULL;
	}
	else
		return (char*)s1;
}

int main()
{
	char *res = My_strstr("abcdefg","cde");
	if(res != NULL)
	{
		cout<<"exist:"<<res<<endl;
	}
	else
	{
		cout<<"no exist!"<<endl;
	}
	return 0;
}


方法三:
#include <iostream>
#include <assert.h>
using namespace std;
char* My_strstr(const char* s1,const char* s2)
{
	const char *p=s1;
	const size_t len=strlen(s2);
	for(;(p=strchr(p,*s2))!=0;p++)// strchr查找字符串s中首次出現字符c的位置
	{
		if(strncmp(p,s2,len)==0)
		{
			return(char*)p;
		}
	}
	return(0);
}
int main()
{
	char *res = My_strstr("abcdefg","cde");
	if(res != NULL)
	{
		cout<<"exist:"<<res<<endl;
	}
	else
	{
		cout<<"no exist!"<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章