模拟库函数(strcpy,strcat,strchr,strstr,strcmp,memcpy,memmove)

来源:互联网 发布:怎么样加入淘宝 编辑:程序博客网 时间:2024/05/21 11:08

1.strcpy
功能:strcpy把从sorc地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

char *my_strcpy(char *dest, const char *sorc){    assert(dest && sorc);     char *ret = dest;    while (*dest++ == *sorc)    {        ;    }    return ret;}

2.strcat
功能:把字符串sorc连接到字符串dest后面。

char *my_strcat(char *dest, const char *sorc){    assert(dest && sorc);    char *ret = dest;    while (*dest++)    {        ;    }    dest--;    while (*dest++ == *sorc++)    {        ;    }    return ret;}

3.strchr
功能:查找字符串string中首次出现字符ch的位置

char *my_strchr(const char *string, char ch){    assert(string);    char *p = (char *)string;    while (*p)    {        if (ch == *p)        {            return p;        }        else        {            p++;        }    }    return NULL;}

4.strstr
功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

char *my_strstr(const char *str1, const char *str2){    assert(str1 && str2);    char *dest = (char *)str1;    char *sorc = (char *)str2;    char *s = NULL;    while (*dest)    {        s = dest;        sorc = (char *)str2;        while (*s == *sorc && *s && *sorc)        {            s++;            sorc++;        }        if (!*sorc)        {            return dest;        }        else        {            dest++;        }    }    return NULL;}

5.strcmp
功能:比较两个字符串大小(按ASCII值大小逐个字符相比较),设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1 < str2,则返回负数;
若str1 > str2,则返回正数。

int my_strcmp(const char *str1, const char *str2){    assert(str1 && str2);    int ret = 0;    while (!(ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str1 && *str2)    {        str1++;        str2++;    }    if (ret > 0)    {        return 1;    }    else if (ret < 0)    {        return -1;    }    return ret;}

6.memcpy
功能:从源sorc所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

void *my_memcpy(void *dest, const void *sorc, size_t n){    assert(dest && sorc);    void *ret = dest;    while (n--)    {        *(char *)dest = *(char *)sorc;        dest = (char *)dest + 1;        sorc = (char *)sorc + 1;    }    return ret;}

7.memmove
功能:从sorc拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后sorc内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

void *my_memmove(void *dest, const void *sorc, size_t count){    assert(dest && sorc);    void *ret = dest;    if (dest <= sorc || (char *)dest >= (char *)sorc + count)  //low to high    {        while (count--)        {            *(char *)dest = *(char *)sorc;            dest = (char *)dest + 1;            sorc = (char *)sorc + 1;        }    }    else  //high to low    {        (char *)dest = (char *)dest + count - 1;        (char *)sorc = (char *)sorc + count - 1;        while (count--)        {            *(char *)dest = *(char *)sorc;            dest = (char *)dest - 1;            sorc = (char *)sorc - 1;        }    }    return ret; }
阅读全文
1 0
原创粉丝点击