温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

字符串操作函数模拟之番外篇

发布时间:2020-08-08 18:16:28 来源:网络 阅读:627 作者:刘二阳二阳 栏目:编程语言

一、strchr()

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

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

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

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;
}



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI