字符/字符串 查找函数

#本篇博客主要内容为模拟实现四个字符/字符串查找函数!

/*
 @避免与库函数冲突,命名为my_strchr;my_strrchr;my_strstr;rmy_strrstr;

*/

#头文件引用在这里一并标出:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

#首先实现兄弟函数 strchrstrrchr ;

/*
    模拟实现 strchr 函数
 
    函数原型:char* strchar(char const *str,int ch);
 
    函数功能:
       在一个字符串中查找一个字符,返回指向该字符第一次出现位置的指针;
 
    注意事项:
       @注意函数的第二个参数是整形值,但是,它包含一个字符值;
       @注意函数的返回值是char*,则如果没有找到该字符则必须返回NULL;
 
代码实现如下;

*/
char* my_strchr(char const *str,int ch)
{
	assert(str);

	while(*str)
	{
      char *ptr = (char*)str;
	 
	  if(*ptr == ch)
		  return ptr ;//注意返回值是char*,如果返回str,注意str的类型
	  else
		  str++;
	}
	return NULL;//如果没找到,则返回值为空;
}

int main()
{
	char *str = "abcdef";
	char key = 'b';//char key = 'g';

	char *ret = my_strchr(str,key);
	printf("%s\n",ret);

	system("pause");
	return 0;
}



 
 
#运行结果:
/*   
    模拟实现函数:strrchr;
   
    函数原型:char* strrchr(char const *str, int ch);
    
    函数功能:       
         在一个字符串中查找一个字符,返回指向该字符最后一次出现位置的指针;
   
     注意事项:     
          @注意函数的第二个参数是整形值,但是,它包含一个字符值;      
          @注意函数的返回值是char*,则如果没有找到该字符则必须返回NULL;     
          @必须找到的是该字符最后一次出现的位置;
  
代码实现如下:
*/

char* my_strrchr(char const *str, int ch)
{
	char *ptr = NULL;//将ptr初始化为空,你将会发现方便很多;
	assert(str);

	while(*str)
	{
		if(*str == ch)//每次出现ch 则将ptr置成str;
			ptr = (char *)str;
		str++;
	}
	/*如果循环结束没有找到则ptr还是为NULL*/
	   return ptr;
}

int main()
{
	char *str = "abcadeaf";
	char key = 'a';//char key = 'g';

	char *ret = my_strrchr(str,key);
	
	printf("%s\n",ret);

	system("pause");
	return 0;
}


 
   
 
#运行结果:
# 接下来实现兄弟函数 strstr 和 strrstr;
/*   
    模拟实现函数:strstr;
    
    函数原型:char* strstr(char const *s1, char const *s2);
    
    函数功能:      
          在字符串s1中查找字符串s2第一次出现的起始位置,并返回一个指向该位置的指针;
   
    注意事项:     
         @如果s2没有完整的出现在s1中,则返回NULL;     
         @如果s2为NULL,则返回s1; 
代码实现如下:
*/

char* my_strstr(char const *s1, char const *s2)
{
	if(s1==NULL)
		return NULL;
	/*
	如果s2为NULL,则返回s1
	*/
	if(s2==NULL)
		return (char*)s1;

	while(*s1)
	{
		/*
		保存每一次开始的位置,方便返回;
		*/
		char *ps1 = (char*)s1;
		char *ps2 = (char*)s2;
		while(*ps1&&*ps2&&(*ps1==*ps2))
		{
			ps1++;
			ps2++;
		}
		if(*ps2=='\0')
			return (char*)s1;
		if(*ps1!='\0')//检测s2有没有完整的出现在s1中;
			s1++;
	}
	return NULL;
}

int main()
{
	char *s1 = "abcdef";
	char *s2 = "cdef";

	printf("%s\n",my_strstr(s1,s2));

	system("pause");
	return 0;
}


 
 
#运行结果
/*  
   模拟实现函数: strrstr;
   函数原型:char* strrstr(char const *s1, char const *s2);
   函数功能:      
          在字符串s1中查找字符串s2最后一次出现的起始位置,并返回一个指向该位置的指针;
   注意事项:     
           @如果s2没有完整的出现在s1中,则返回NULL;     
           @如果s2为NULL,则返回s1;     
           @在这个函数中将调用库中的strstr函数;
代码如下:
*/

char* my_strrstr(char const *s1, char const *s2)
{
	char *last = NULL;
	char *current = NULL;
	assert(s1);
	/*
	把指针初始化为我们已经找到的前一次匹配的位置;
	*/
	if(*s2!=NULL)//只有s2不为NULL才进行查找,否则返回NULL;
	{
		current = (char *)strstr(s1,s2);
		//因为库函数中的返回值为const char*;
		/*
		每次找到字符串时,让指针指向它的起始位置,
		然后查找该字符串下一个匹配位置;
		*/
		while(current != NULL)
		{
			last = current;
			current = (char*)strstr(last+1,s2);
		}
	}
	return last;//返回最后一次找到的位置的指针;
}

int main()
{
	char *s1 = "abcdefabcdefabcd";
	char *s2 = "abcd";

	printf("%s\n",my_strrstr(s1,s2));

	system("pause");
	return 0;
}


# 完善后的代码,觉得更好看一点!

char* my_strrstr(const char *s1, const char *s2)
{
	const char *cur = NULL;
	const char *last = NULL;

	assert(s1);
	assert(s2);

	if(!*s2)
		return (char *)s1;

	while((cur = strstr(s1,s2)))
	{
		last = cur;
		s1 = cur + 1;
	}
	return (char *)last;
}

int main()
{
	char *s1 = "abcdefbcdef";
	char *s2 = "fbc";
	
	char *ret = my_strrstr(s1,s2);

	if(ret!=NULL)
		printf("%s\n",ret);
	
	system("pause");
	return 0;
}


 
 
#运行结果:

ps: 文中部分引用《C和指针》;

本篇博客结束!
谢谢!



你可能感兴趣的:(函数,字符串函数)