字符/字符串 查找函数

来源:互联网 发布:帝国cms模板安装教程 编辑:程序博客网 时间:2024/05/17 04:10

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

/*
 @避免与库函数冲突,命名为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和指针》;

本篇博客结束!
谢谢!



1 0