/*
模拟实现strlen的三种方式
*/
int myStrlen(const char *str)
{//方式1,计数器方式
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int myStrlen2(const char *str)
{//方式2:不创建临时变量
if (*str == '\0')
{
return 0;
}
else
{
return 1 + myStrlen2(str+1);
}
}
int myStrlen3(const char *str)
{//方式3:指针-指针方式
char *p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
//模拟实现strcpy
char *my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(*dest);
assert(src);
while (*dest++ = *src++)//注意这里不能是(*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)
{//将src中的字符串拷贝进dst
int ret = 0;
while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{
++src;
++dst;
}
if (ret < 0)
{
ret = -1;
}
else if (ret>0)
{
ret = 1;
}
return ret;
}
//模拟实现memcpy
void *my_memcpy(void *dst, const void *src, int count)
{//注意:以memcpy开头的函数操作的基本单位都是字节
void *ret = dst;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}
//模拟实现memmove
void *my_memmove(void *dst,const void *src,int count)
{
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;
}