常见字符串函数的模拟实现(一)(c语言)

1.三种方式模拟实现strlen函数
2.模拟实现strcpy
3.模拟实现strcat
4.模拟实现strcmp
5.模拟实现strstr
6.模拟实现memcpy
7.模拟实现memmove

//模拟实现strlen(求字符串长度)

// 1>指针
int my_strlen(char const*s)
{
    char*p = s;
    while (*p != 0)
    {
        p++;
    }

    return p - s;
}
int my_strlen(char s[])
{
    int len = 0;
    while (*s++ != 0)
    {
        len++;
    }
    return len;
}


// 2>函数递归
int my_strlen(char*s)
{
    if (*s == '\0')
        return 0;
    else
        return 1 + my_strlen(s + 1);
}


// 3>计数
int my_strlen(char s[])
{
    int i = 0;
    int count = 0;
    while (s[i++] != '\0')
        count++;
    return count;
}
//模拟实现strcpy (拷贝字符串)


char* my_strcpy(char*dest, char const*src)
{
    char* ret = dest;
    assert(src!=NULL);
    assert(dest != NULL);
    while (*src)
    {
        *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}
//模拟实现strcat(字符串链接)


char* my_strcat(char*dest, const char* src)
{
    char* ret = dest;
    assert(*dest != 'NULL');
    assert(*src != 'NULL');
    while (*dest != '\0')
        dest++;
    while (*dest++ = *src++)//将src链接到dest上
    {
        ;
    }
    return ret;
}
//模拟实现strcmp(字符串比较)

int my_strcmp(const char*src1, const char*src2)
{
    //判断两个源字符串都不为空
    assert(*src1 != '\0');
    assert(*src2 != '\0');                  
    while (!(*src1 - *src2) && src2)
    {
        *src1++;
        *src2++;
    }
    return*src1 - *src2;
}
//模拟实现strstr(查找子串)

char* my_strstr(const char*src, const char*sub)
{
    assert(src);
    assert(sub);
    char*p = src;
    char*s1 = p;
    char*s2 = sub;
    while (*s1)
    {
        s1 = p;
        s2 = sub;
        while ((*s1 != '\0') && (*s2 != '\0'))
        {
            if (*s1++ == *s2++)
            {
                ;
            }
            else
            {
                p++;
                break;
            }
            if (*s2 == '\0')
            {
                return p;
            }
        }
    }

}
//模拟实现memcpy(不考虑内存重叠时的内存拷贝)


void my_memcpy(void*dest, const void*src, int count)
{
    char *psrc, *pdest;
    psrc = (char *)src;
    pdest = (char *)dest;
    while (count--) 
    {
        *pdest++ = *psrc++;

    }
}
//模拟实现memmove(复制内存)


void* my_memmove(void*dest, const void*src, int count)
{
    char*psrc;
    char*pdest;
    if ((NULL ==dest) || (NULL == src))
    {
        return NULL;
    }
    if ((src<dest) && (char*)src + count>(char*)dest)
    {
        psrc = (char*)src + count - 1;
        pdest = (char*)dest + count - 1;
        while (count--)
        {
            *pdest-- = *psrc--;
        }
    }
    else
    {
        psrc = (char*)src;
        pdest = (char*)dest;
        while (count--)
        {
            *pdest++ = *psrc++;
        }
    }
    return dest;
}

以上代码均已运行测试过,如有错误,忘指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值