C语言memset、memcpy、memmove和strcpy

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
/*************** src拷贝长度n给dset *******************/
void *mymemcpy(void *dest, const void *src, size_t n)
{   
    char *d = (char*)dest;
    char *s = (char*)src;
    while(n--)
        *d++ = *s++;
    return dest;
}

/*************** src赋值为ch,共赋值n个 *******************/
void *mymemset(void *src, int ch, size_t n)
{
    assert(src != NULL);
    char *tempsrc = (char *)src;
    while (n--)
        *tempsrc++ = (char)ch;
    //return src;
}

char *mystrlen(char *dest, const char *src)
{
    //dest和src不相等且不为NULL
    if ((dest == NULL) || (src == NULL))
        return NULL;
    if (dest == src)
        return dest;
    char *tempdest = dest;
    while ((*dest++ = *src++) != '\0');
        return tempdest;
}

/*************** src拷贝长度n给dset *******************/
void *mymemmove(void *dest, const void *src, size_t n)
{
    char temp[n];
    int i;
    char *d = (char*)dest;
    const char *s = (const char *)src;
    for (i = 0; i < n; i++)
        temp[i] = s[i];
    for (i = 0; i < n; i++)
        d[i] = temp[i];
    return dest;
}


int main()
{
    char a[] = "11111111111111";
    char b[] = "22222222222222222";
    char c[] = "333333";
    char d[] = "4444";
    char e[] = "55555555555555";
    char f[] = "66666666666";
    char g[] = "777777777777777777";
    //mymemcpy(a,2,3);
    mymemset(a, '+', 7);
    printf("b[] == %s\n", b);
    mymemcpy(b,a,10);
    printf("a[] == %s\n", a);
    printf("b[] == %s\n", b);
    mystrlen(c,d);
    printf("c[] == %s\n", c);
    printf("d[] == %s\n", d);
    strcpy(e, "111");
    printf("e[] == %s\n", e);
    //memcpy和memmove区别是,当内存发生局部重叠的时候
    //memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确
    mymemmove(f,g,5);
    printf("f[] == %s\n", f);
    printf("g[] == %s\n", g);
    return 0;
}

memcpy和strcpy区别
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

memcpy和memmove的区别
1.内存重叠memcpy会有出现问题,memcpy是memmove的一部分

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值