#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++;
}
}
}