#include <stdio.h> #include <stdlib.h> //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 != ' ';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 ",my_strstr("hello world","world")); printf("%s ",my_strstr("hello world","e")); printf("%s ",my_strstr("hello world","llo")); return 0; }
执行结果:
2013年10月10日17:23分补充下面算法
不使用库函数来实现strstr函数,效率其实也不高,高效率应该使用KMP法
#include <stdio.h> char* strstr(char* buf, char* sub) { char* bp; char* sp; if(sub == NULL) return buf; 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 ",strstr("hello world", "ell")); return 0; }
执行结果: