您的位置:首页 > 其它

字符/字符串 查找函数

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和指针》;

本篇博客结束!
谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: