C:字符串库函数的模拟实现(memmove、memcpy、strstr、strcat、strcmp、strcpy、strlen等)

一、memmove

void *memmove( void *dest, const void *src, size_t count );

 memmove函数将count字节的字符从src复制到dest。

如果源区域和目标区域的某些区域重叠,memmove将确保在覆盖之前复制重叠区域中的原始源字节。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

void* my_memmove(void* dst, const void* src, size_t count)
{
    void* ret = dst;
    assert(dst);
    assert(src);
    //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容
    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        //从前往后复制,则不会出现覆盖src中没有复制的内容
        while (count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后往前复制,则不会出现覆盖src中没有复制的内容
        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;
}
int main()
{
    char arr[10] = "abcdefg";
    char arr0[10] = "abcdefg";
    char arr1[10] = { 0 };
    my_memmove(arr + 2, arr, 4);
    my_memmove(arr1, arr0, 4);
    printf("内存覆盖情况:%s\n", arr + 2);
    printf("正常情况:%s\n", arr1);
    return 0;
}

运行结果:

 二、memcpy

void *memcpy( void *dest, const void *src, size_t count );

memcpy函数将src的count字节复制到dest。

如果源和目标重叠,此函数不能确保在覆盖之前复制重叠区域中的原始源字节。使用memmove处理重叠区域。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

void* my_memcpy(void* dst, const void* src, size_t count)
{
    void* ret = dst;
    assert(dst);
    assert(src);
    while(count--)
    {
        *(char*)dst = *(char*)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }
    return ret;
}
int main()
{
    char dst[] = "abcdefghigk";
    char src[] = "hello world";
    void* ret = my_memcpy(dst, src, 8);
    printf("%s\n", (char*)ret);
    return 0;
}

 运行结果:

三、 strstr

char* strstr( const char* str1, const char* str2 );

在一个字符串中找子字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

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++;
    }
}
int main()
{
    char str1[] = "abcdefghi";
    char str2[] = "bcd";
    char* ret = my_strstr(str1, str2);//在arr1中找arr2字符串第一次出现的位置
    if (ret != NULL)
        printf("%s\n", ret);
    else
        printf("找不到字符串\n");
    return 0;
}

 运行结果:

四、strcat 

char* strcat( char* dest, const char* src );

追加字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
    assert(dest);
    assert(src);
    char* ret = dest;
    while (*dest)
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char dest[20] = "hello ";
    char src[] = "world";
    strcat(dest, src);
    printf("%s\n", dest);
    return 0;
}

 运行结果:

五、strcmp 

int strcmp (const char* src, const char* dest);

 字符串的比较

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* src, const char* dest)
{
    assert(src);
    assert(dest);
    int ret = 0;
    while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
        ++src, ++dest;
    if (ret < 0)
        ret = -1;
    else if (ret > 0)
        ret = 1;
    return ret;
}
int main()
{
    char src[] = "hello";
    char dest[] = "world";
    int ret = my_strcmp(src, dest);
    printf("%d\n", ret);
    return 0;
}

运行结果:

 六、strcpy

char* strcpy( char* Destination, const char* Source );

把含有’\0’结束符的字符串复制到另一个字符串中

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src)
{
    assert(dest);
    assert(src);
    char* ret = dest;
    while (*dest++ == *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "****************";
    char arr2[] = "hello";
    char* ret = my_strcpy(arr1, arr2);
    printf("%s\n", ret);
    return 0;
}

 运行结果:

 七、strlen

size_t strlen ( const char* str );

计算指定字符串的长度

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

int my_strlen(const char* str)
{
    assert(str);
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}
int main()
{
    char* str = "abcdef";
    printf("%d\n", my_strlen(str));
    return 0;
}

 运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值