一、strchr()
函数原型:char *strchr( const char *string, int c );
strchr() 函数查找字符在指定字符串中首次出现的位置,如果找到,就返回指定字符在已知字符串中最后一次开始出现的位置,找不到就返回NULL。例如:已知字符串“abdedef”,该函数返回“dedef”
char *my_strchr(const char *str,int c) { assert(str); while(*str) { if(*str == c) return (char *)str; //找到后返回此时的位置 str++; } return NULL; //没找到 }
二、strrchr()
函数原型:char *strrchr( const char *string, int c );
strrchr()函数正好与strchr()函数相反,此函数是查找字符在指定字符串中从正面开始数最后一次出现的位置,若找到,就返回最后一次开始出现的位置,否则返回NULL。还用上边的字符串为例,该函数返回的是结果是“def”
char *my_strrchr(const char *str,int c) { const char *p = NULL; assert(str); while(*str) { if(*str == c) { p = str; //每次出现的位置都记录,p会一直改变 } str++; } if(*str == ‘\0‘) return (char *)p; else return NULL; }
三、strrstr()
我们都知道在库函数中有strstr(),它是查找自字符串的,但是类似于上边,我们要是想实现一个函数来返回子字符串在指定字符串中最后一次出现的位置该怎么做呢?!
这样想,既然strstr()是查找首次出现的位置并且是正序查找的,那要查找最后一次就反着来吧。首先,让两个指针指向两个字符串‘\0‘的前一个字符,接着让指针向前移动,直到匹配完成。但是,这次的循环不再用结束符 ‘\0‘来控制,而是用两个字符串的长度
char *my_strrstr(const char *str,const char *strs,int len1,int len2) { const char *l_start = str+len1-1; //指向str最后一位 const char *end = strs+len2-1; //end指向strs最后一位 assert(str); assert(strs); while(len1) { str = l_start; while((len2 != 1) && (*strs == *str)) { str--; strs--; len2--; //指针向前挪动一位,字符串长度-1 } l_start = str; //匹配完成,记住子字符串的第一位 if(len2 == 1) return (char *)l_start; if(*str != *strs) { l_start = l_start-1; strs = end; } len1--; } return NULL; }
原文:http://10969583.blog.51cto.com/10959583/1771066