C语言学习分享/字符函数-memcpy memset

#define _CRT_SECURE_NO_WARNINGS 1
void*memcpy(void*destinantion,const void*source,size_t num)
函数从source的位置开始向后复制num个字节的数据到destination的内存位置
这个函数遇到‘\0’时并不会停下来
如果source与destination有任何重叠,复制的结果都是未定义的

#include <stdio.h>
#include <string.h>
#include <assert.h>
struct s
{
    char name[20];
    int age;
};
模拟实现
void* my_memcpy(void* a,const void* b, size_t n)
{
    assert(a!=0);
    assert(b!=0);
    char* pa = (char*)a;
    char* pb = (char*)b;
    void* c = pa;
    while (n--)
    {
        *pa = *pb;
        pa++;
        pb++;
    } 
    return c;
}
void* my_memmove(void* a, const void* b, size_t n)
{
    assert(a);
    assert(b);
    char* pa = (char*)a;
    char* pb = (char*)b;
    void* c = pa;
    if (pa < pb||pa>(pb+n))
    {

        while(n--)
        {
            *pa = *pb;
            pa++;
            pb++;
        }
    }
    else
    {
        while(n--)
        {
            *(pa + n) = *(pb + n);//从后往前复制
        }
    }
    return c;
}
int main()
{
    int arr[] = { 1,2,3,4,5 };
    int brr[10] = { 0 };               //注明空间大小
    memcpy(brr, arr, sizeof(arr));     //

    struct s a[] = { {"张三",20},{"李四",19} };
    struct s b[10] = { 0 };
    memcpy(b, a,sizeof(a));
    
    char crr[] = "qwert";
    char drr[10] = {0};
    memcpy(drr, crr, 2);

    char err[] = "qwert";
    char frr[10] = { 0 };
    my_memcpy(frr, err, sizeof(err));

    //内存重叠问题
    int grr[] = {1,2,3,4,5,6,7,8,9,10};//目标为取12345替换34567
    my_memcpy(grr+2,grr,20);   //20个字节--int类型的5个元素
                               //结果为1 2 1 2 1 2 1 8 9 10 因此my_memcpy无法处理内存重叠问题

    int jrr[] = { 1,2,3,4,5,6,7,8,9,10 };
    my_memmove(jrr+2,jrr,20);  //可以解决内存重叠问题

    int hrr[] = { 1,2,3,4,5,6,7,8,9,10 };
    memmove(hrr + 2, hrr, 20);  
    int irr[] = { 1,2,3,4,5,6,7,8,9,10 };
    memcpy(irr + 2, irr, 20);   //库函数memcpy,memmove可以胜任内存重叠问题
    return 0;                   
}


int memcmp(const void*a,const void*b,size_t num);
比较a,b的前num个字节
与strcmp的返回值相似(小于返回负数)

#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[] = { 1,2,4,4,3 };
    printf("%d\n",memcmp(arr1, arr2, 8));
    printf("%d\n", memcmp(arr1, arr2, 9));
}

memset--内存设置
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[20] = "";
    memset(arr,'1',10);
    printf("%s\n",arr);

    int brr[] = {1,2,3,4,5};
    memset(brr,1,20); //20个字节改成1 -- 01010101 01010101 01010101 01010101 01010101
    int i =0;         //内存为16进制化为10进制输出  01010101--16843009
    for(i=0;i<sizeof(brr)/sizeof(brr[0]);i++)
    {
        printf("%d\n",brr[i]);
    }
    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值