#include<stdio.h> #include<assert.h> #include<stdlib.h> #include<string.h> int My_strstr(const char * str, const char * sub) { assert(*str !=NULL); assert(*sub !=NULL); int i = 0; int j = 0; while(str[i]!='\0' && sub[j]!='\0')//如果主串和模式串对应位置的值相等,继续比较 { if( str[i] == sub[j] ) { i++; j++; } else //如果不相等,则模式串需要回朔到第一个字符,而主串则从下一个字符开始 { i = i-j+1; //上一次匹配的下一个位置 正则表达式 lastindex ??? j = 0; } } if( sub[j]=='\0' ) //如果循环是模式串遍历完了而结束的,则说明找到了对应子串的位置 { printf("Successful!\n"); return i-j+1; } else //匹配失败 { printf("False!\n"); return false; } } //c第一次出现的位置 实现strchr int strchr(const char *str, char c) { assert(NULL != str); int i; for(i =1; *str != c;str++&&i++); //i= 1 从第一位开始 { if(*str == '\0') { return NULL; } } return i; } //用my_strchr实现 朴素匹配 有BUG 暂不展示 int My_strchr(const char * str , const char * sub) { int i=0,j=0; while(str[i]!='\0') { if(strchr(&str[i],sub[j])==0) { i++; j++; } else { i++; j=0; } }//有一点问题 暂待修改 } int My_strncmp(const char * str ,const char * sub) { int length = strlen(sub);//每次比较的个数就是字符串 sub的长 int i=0,j=0; while(str[i]!='\0' && sub[j]!='\0') { if(strncmp(&str[i],&sub[j],length)==0) { return i+1; } else { i++; j=0; } } } int main() { char *str1 ="iloveyou "; char *sub1 ="ey"; char a ='o'; //printf("The %d th.\n", My_strstr(str1,sub1)); //朴素匹配---strstr //printf("The %d th\n", Mystrchr(str1,a) ); //朴素匹配单个字符---strstr printf("%d",My_strchr(str1,sub1)); //失败 //printf("the right way is %d\n",My_strncmp(str1,sub1)); getchar(); return 0; }
Memcpy 两种算法 暂时先写 不考虑内存重叠版本
/3.memcpy()由s2指定内存区域拷贝count个字符到s1所指定的内存区域。s2和s1内存区域不能重叠,函数返回指向s1的指针。 //3.1.未考虑内存重叠 void * my_memcpy1(void *s1,const void *s2,int count) { void * ret = s1; while (count--) { *(char *)s1 = *(char *)s2; s1 = (char *)s1 + 1; s2 = (char *)s2 + 1; } return(ret); }
用strcmp和strchr一起实现的
//2.用 strncmp,strchr (参考杨同学的) char *My_strstr3(char *s1, char *s2) { assert(s2 != NULL); assert(s2 != NULL); char ch = *s2; int len = strlen(s2); while (*s1 != '\0') { if (strncmp(strchr(s1, ch), s2, len) == 0) { return strchr(s1, ch); } else { s1++; } } }