字符串操作函数模拟之番外篇-创新互联

一、strchr()

成都创新互联公司主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、成都全网营销、网站程序开发、HTML5响应式重庆网站建设公司手机网站制作设计、微商城、网站托管及网站维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为成都VR全景行业客户提供了网站维护服务。

 函数原型:char *strchr( const char *string, int c );

 strchr() 函数查找字符在指定字符串中首次出现的位置,如果找到,就返回指定字符在已知字符串中最后一次开始出现的位置,找不到就返回NULL。例如:已知字符串“abdedef”,该函数返回“dedef”

#include
#include
#include

char *my_strchr(const char *str,int c)
{
	assert(str);
	while(*str)
	{
		if(*str == c)
			return (char *)str;         //找到后返回此时的位置
		str++;
	}
	return NULL;                        //没找到
}

int main()
{
	char *str = "abcdcdef";
	char *ret = my_strchr(str,'d');
	printf("%s\n",ret);
	system("pause");
	return 0;
}

二、strrchr()

 函数原型:char *strrchr( const char *string, int c );

 strrchr()函数正好与strchr()函数相反,此函数是查找字符在指定字符串中从正面开始数最后一次出现的位置,若找到,就返回最后一次开始出现的位置,否则返回NULL。还用上边的字符串为例,该函数返回的是结果是“def”

下面看三种实现方法:

1.从正面数,保存每个位置,则最后一次找到的即为最后一次出现的字符

char *my_strrchr(const char *str,int c)     
{
	const char *p = NULL;
	assert(str);
	while(*str)
	{
		
		if(*str == c)
		{
			p = str;            //保存每一次出现该字符的地址
		}
		str++;
	}
	if(*str != '\0')
		return (char *)p;
	return NULL;
}

2.从后面数,遇到的第一个字符即为最后一次出现的字符

char *my_strrchr(const char *str,int ch)
{
	const char *start = str;                //将指定字符串首地址保存
	assert(str);
	while(*str)
	{
		str++;
	}
	//str--;
	//while(*str--)
	//{
	//	;
	//}
	while((str >= start) && (*str != ch))
	{
		str--;
	}
	if(*str == ch)
		return (char *)str;
	return NULL;
}

3.调用strchr函数

char *my_strrchr(const char *str,int ch)
{
	const char *cur = NULL;
	const char *last = NULL;
	assert(str);
	while(cur = strchr(str,ch))
	{
		last = cur;       //保存每一次找到的位置
		str = cur+1;
	}
	return (char *)last;
}

三、strrstr()

  我们都知道在库函数中有strstr(),它是查找自字符串的,但是类似于上边,我们要是想实现一个函数来返回子字符串在指定字符串中最后一次出现的位置该怎么做呢?!

下面看两种实现方法:

1.从后向前找字符串(由于这种查找凡事不能再遇到'\0',所以不能以'\0'作为循环条件,而用字符串的长度来控制循环)

char *my_strrstr(const char *str,const char *substr,int len1,int len2)
{
	const char *l_start = str+len1-1;
	const char *end = substr+len2-1;
	assert(str);
	assert(substr);
	while(len1)
	{
		str = l_start;
		while((len2 != 1) && (*substr == *str))
		{
			str--;
			substr--;
			len2--;
		}
		l_start = str;
		if(len2 == 1)
			return (char *)l_start;
		if(*str != *substr)
		{
			l_start = l_start-1;
			substr = end;
		}
		len1--;
	}
	return NULL;
}	

显然这种方法有点麻烦,而且传参太多。那么就有第二种实现方法了。

2.同实现strrchr一样,调用strstr函数

char *my_strrstr(const char *str,const char *substr)
{
	const char *last = NULL;
	const char *cur = NULL;
	assert(str);
	if(!*substr)
		return (char *)substr;
	while(cur = strstr(str,substr))
	{
		last = cur;            //每次保存找到的字符串的首位置
		str = last+1;          //使str指向下一位开始寻找
	}
	return (char *)last;
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:字符串操作函数模拟之番外篇-创新互联
文章出自:http://pwwzsj.com/article/dgedeg.html