字符串操作函数模拟之番外篇
一、strchr()
函数原型:char *strchr( const char *string, int c );
strchr() 函数查找字符在指定字符串中首次出现的位置,如果找到,就返回指定字符在已知字符串中最后一次开始出现的位置,找不到就返回NULL。例如:已知字符串“abdedef”,该函数返回“dedef”
#include<stdio.h>#include<assert.h>#include<stdlib.h>char*my_strchr(constchar*str,intc){assert(str);while(*str){if(*str==c)return(char*)str;//找到后返回此时的位置str++;}returnNULL;//没找到}intmain(){char*str="abcdcdef";char*ret=my_strchr(str,'d');printf("%s\n",ret);system("pause");return0;}
二、strrchr()
函数原型:char *strrchr( const char *string, int c );
strrchr()函数正好与strchr()函数相反,此函数是查找字符在指定字符串中从正面开始数最后一次出现的位置,若找到,就返回最后一次开始出现的位置,否则返回NULL。还用上边的字符串为例,该函数返回的是结果是“def”
下面看三种实现方法:
1.从正面数,保存每个位置,则最后一次找到的即为最后一次出现的字符
char*my_strrchr(constchar*str,intc){constchar*p=NULL;assert(str);while(*str){if(*str==c){p=str;//保存每一次出现该字符的地址}str++;}if(*str!='\0')return(char*)p;returnNULL;}
2.从后面数,遇到的第一个字符即为最后一次出现的字符
char*my_strrchr(constchar*str,intch){constchar*start=str;//将指定字符串首地址保存assert(str);while(*str){str++;}//str--;//while(*str--)//{//;//}while((str>=start)&&(*str!=ch)){str--;}if(*str==ch)return(char*)str;returnNULL;}
3.调用strchr函数
char*my_strrchr(constchar*str,intch){constchar*cur=NULL;constchar*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(constchar*str,constchar*substr,intlen1,intlen2){constchar*l_start=str+len1-1;constchar*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--;}returnNULL;}
显然这种方法有点麻烦,而且传参太多。那么就有第二种实现方法了。
2.同实现strrchr一样,调用strstr函数
char*my_strrstr(constchar*str,constchar*substr){constchar*last=NULL;constchar*cur=NULL;assert(str);if(!*substr)return(char*)substr;while(cur=strstr(str,substr)){last=cur;//每次保存找到的字符串的首位置str=last+1;//使str指向下一位开始寻找}return(char*)last;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。