字符/字符串 查找函数
2016-05-07 11:07
363 查看
#本篇博客主要内容为模拟实现四个字符/字符串查找函数!
/*@避免与库函数冲突,命名为my_strchr;my_strrchr;my_strstr;rmy_strrstr;
*/
#头文件引用在这里一并标出:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h>
#首先实现兄弟函数 strchr 和strrchr;
/*
模拟实现 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和指针》;
本篇博客结束!
谢谢!
相关文章推荐
- Hibernate入门(一)之 hibernate的配置,运行流程以及优缺点解析
- RCFile 简介及其应用
- 【CodeVS4244】平衡树练习
- 重新学javaweb ---- DbUtils
- AWK命令详解
- Max Sequence
- AOJ 0121:Seven Puzzle(bfs)
- 零基础学python》(第二版)
- 杀僵尸进程备忘
- unity 控制移动的方法
- 在糖尿病患者信息管理系统中,导入病人信息功能!
- 我的第二个springboot项目 web+freemarker
- Android之Matrix的用法
- iOS IPv6-only
- ZooKeeper分布式过程协同技术详解
- java 中对对象的调用
- java输入输出
- 框架的选择
- 面试题小结二
- 选择c++还是java,程序员如何提高研发技术?