#include
#include//malloc()函数
typedef unsigned int size_t;
size_t my_strlen(const char * str)
{
const char *sc = NULL;
if(str == NULL)
return 0;
for(sc = str;
*sc != '\0';
sc++)
{
/*do nothing */
}
return sc - str;
}/*因为类型可以为任意,所以形参应为void *
*相等则返回0,否则不为0
*/
int my_memcmp(const void *s1,const void *s2,size_t count)
{
int res = 0;
const unsigned char *p1 =(const unsigned char *)s1;
//注意是unsigned char *
const unsigned char *p2 =(const unsigned char *)s2;
for(p1 ,p2;
count > 0;
p1++,p2++,count--)
if((res =*p1 - *p2) != 0) //不相当则结束比较
break;
return res;
}
/* 查找字符串s2是否为s1的子串,s1为主串
* 如果是则返回从第一个子串开始的字符串
*/
char * my_strstr(const char *s1,const char *s2)
{
int len1,len2;
len2 = my_strlen(s2);
//获取子串s2的长度
if(!len2)//如果子串s2为空则返回s1
return (char *)s1;
//先强制类型转换
len1 = my_strlen(s1);
//获取主串s1的长度
while(len1 >= len2)
{
len1--;
if(!my_memcmp(s1,s2,len2)) //my_memcmp返回0表示s1中存在s2的子串
return (char *)s1;
//先强制类型转换
s1++;
}
return NULL;
//len1 < len2时返回空
}int main()
{
printf("%s\n",my_strstr("hello world","world"));
printf("%s\n",my_strstr("hello world","e"));
printf("%s\n",my_strstr("hello world","llo"));
return 0;
}
执行结果:
文章图片
2013年10月10日17:23分补充下面算法
不使用库函数来实现strstr函数,效率其实也不高,高效率应该使用KMP法
#include char* strstr(char* buf, char* sub)
{
char* bp;
char* sp;
if(sub == NULL)
returnbuf;
while(buf !=NULL)
{
bp=buf;
sp=sub;
do{
if(!*sp)//sp到最后即sub到最后则返回第一个子串在主串的位置
return buf;
}while(*bp++ == *sp++);
buf++;
//如果不等,主串buf+1,子串回溯到0
}
return 0;
}int main()
{
printf("%s\n",strstr("hello world", "ell"));
return 0;
}
执行结果:
【strstr和memcmp函数的实现】
文章图片
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【C】题目|【C语言】题集 of ⑥
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- c语言|C语言初期学习遇到的特殊点 【三子棋详解】【初学者福音,详细总结,复习能手】
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 个人理解|【C语言基础之类型转换】
- c语言|【C语言】自定义类型 结构体 枚举 联合
- 学习分享|【C语言函数基础】