memcpy使用&模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:42:34 2022/02/26
【摘要】 memcpy函数和memmove函数的区别C语言库函数中,二者都可以进行重叠和不重叠的内存拷贝但是C语言标准只规定了memcpy函数可以实现内存不重叠的问题即可,内存重叠的问题交给memmove函数处理 memcmp:内存比较函数比较前count个字节使用strcmp()只能比较字符串,而memcmp()可以比较整形,也可以比较字符串int main(){ int arr1[] = ...

memcpy函数和memmove函数的区别

C语言库函数中,二者都可以进行重叠和不重叠的内存拷贝

但是C语言标准只规定了memcpy函数可以实现内存不重叠的问题即可,内存重叠的问题交给memmove函数处理


memcmp:内存比较函数

image-20220209221422440

比较前count个字节

image-20220209221429254


使用strcmp()只能比较字符串,而memcmp()可以比较整形,也可以比较字符串

int main()
{
    int arr1[] = {1,2,3,4};
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
    int arr2[] = {1,2,3,5};
    //01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
    int ret = memcmp(arr1,arr2,12);
    //比较前12个字节,二者相同,返回0
    printf("%d\n",ret);//0
    ret = memcmp(arr1,arr2,13);
    //比较前13个字节,arr1中的04比arr2中的05小,返回-1
    printf("%d\n",ret);	//-1
}

模拟实现memcmp()

注意:由于不知道传过来的是什么类型->使用void*类型接收,由于要比较的字节数恒大于0,所以用size_t接收,

由于只知道要比较的字节数,不知道是什么类型->所以使用char* 一个字节一个字节的向后比较,直到找到二者中字节对应内容不相等时,比较此时二者字节内容

int my_memcmp(const void* p1, const void* p2, size_t count)
{
    assert(p1 && p2);
    while (count--)
    {
        //如果二者指向的一个字节内容相等->指向下一个字节
        if (*(char*) p1 == *(char*)p2)
        {
            p1 = (char*)p1+1;
            p2 = (char*)p2+1;
        }
        else
        {
            //此时二者指向的字节内容不相同
            //通过强转为char* 比较此时二者指向的一个字节内容
            if ((*(char*)p1 - *(char*)p2) > 0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
    }
    //跳出循环时,count = 0,说明二者要比较的字节的内容都相同
        return 0;

}
int main()
{
    int arr1[] = { 1,2,3,4 };
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
    int arr2[] = { 1,2,3,99 };
    //01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
    int ret = my_memcmp(arr1, arr2, 12);
    //比较前12个字节,二者相同,返回0
    printf("%d\n", ret);    //0
    ret = my_memcmp(arr1, arr2, 13);
    //比较前13个字节,arr1中的04比arr2中的05小,返回-1
    printf("%d\n", ret);    //-1
    char* p1 = "Mangopp";
    char* p2 = "Mangoppp";
    ret = memcmp(p1, p2, 8);
    printf("%d\n", ret);    //-1
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。