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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值