无网不进  
软硬件开发
/* 
模拟实现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;  
}  


[cpp] view plain copy
 
//模拟实现strcpy  
char *my_strcpy(char *dest, const char *src)  
{  
    char *ret = dest;  
    assert(*dest);  
    assert(src);  
    while (*dest++ = *src++)//注意这里不能是(*dest)++ = (*src)++,要分清这两者的区别  
    {  
        ;  
    }  
    return ret;  
}  


[cpp] view plain copy
 
//模拟实现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;  
      
}  


[cpp] view plain copy
 
//模拟实现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++;  
    }  
}  


[cpp] view plain copy
 
//模拟实现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;  
}  


[cpp] view plain copy
 
//模拟实现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;  
}  


[cpp] view plain copy
 
//模拟实现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;  
}  

 

posted on 2018-05-18 18:03  无网不进  阅读(196)  评论(0)    收藏  举报