模拟实现多种函数(strlen,strcpy,strcat,strstr,strcmp,memcpy,memmove)
●模拟实现strlen三种方式:
方式一
//计数器方式
int my_strlen(const char *str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
方式二
//不能创建临时变量计时器
int my_strlen(const char *str)
{
if(*str=='\0')
return 0;
else
return 1+my_strlen(str+1);
}
方式三
//指针-指针方式
int my_strlen(char * s)
{
char *p = s;
while(*p!=‘\0’)
p++;
return p-s;
}
●模拟实现strcpy:
注意
● 参数顺序。
●函数的功能、停止条件
●assert
●const 修饰指针
●函数返回值
char *my_strcpy (char * dest,const char * src)
{
char*ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while((*dest++=*src++))
{
;
}
return ret;
}
●模拟实现strcat:
char * my_strcat(char * dest,const char * src)
{
char * ret = dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*dest)
{
dest++;
}
while((*dest++=*src++))
{
;
}
return ret;
}
●模拟实现strstr:
char * my_strstr(const char * str1,const char * str2)
{
assert(str1);
assert(str2);
char * cp=(char*)str1;
char * substr=(char*)str2;
char * s1=NULL;
if(*str2=='\0')
return NULL;
while(*cp)
{
s1=cp;
substr=str2;
while(*s1 && *substr&&(*s1==*substr))
{
s1++;
substr++;
}
if(*substr=='\0')
return cp;
cp++;
}
}
●模拟实现strcmp:
int my_strcmp(const char * src,const char * dst)
{
int ret = 0;
while(!(ret =*(unsignedchar*)src-*(unsignedchar*)dst)&&*d
st)
++src,++dst;
if(ret < 0)
ret = -1;
else if(ret > 0)
ret = 1;
return(ret);
}
●模拟实现memcpy:
void *memcpy(void * dst,const void * src,size_tcount)
{
void *ret = dst;
while(count--)
{
*(char*)dst=*(char*)src;
dst=(char*)dst+1;
src=(char*)src+1;
}
return(ret);
}
●模拟实现memmove:
void * memmove(void *dst,const void * src,size_tcount)
{
void *ret = dst;
if(dst<=src||(char*)dst>=((char*)src+count))
{
while(count--)
{
*(char *)dst=*(char*)src;
dst=(char*)dst+1;
src=(char*)src+1;
}
}
else
{
dst=(char*)dst+count-1;
src=(char*)src+count-1;
while(count--)
{
*(char*)dst=*(char*)src;
dst=(char*)dst-1;
src=(char*)src-1;
}
}
return(ret);
}