详解C语言中strcpy函数与memcpy函数的区别与实现

 更新时间:2022年12月29日 15:26:06   作者:ZHENGZJM  
这篇文章主要介绍了C语言中字符串拷贝函数(strcpy)与内存拷贝函数(memcpy)的不同及内存拷贝函数的模拟实现,感兴趣的小伙伴可以跟随小编一起学习一下

字符串拷贝函数(strcpy)

函数原型

由图可知,strcpy的形参是(目的地址,来源地址),返回值为char *。

应用实例

我们将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10] = "abcdefg";
    char brr[10] = { 0 };
    strcpy(brr, arr);
    printf("%s", brr);
    return 0;
}

缺点

如果不是字符类型,还能这样拷贝吗?

我们发现,编译器直接报错了,因为形参跟实参不兼容。 strcpy具有局限性,只能适用于字符类型的拷贝。我们想要任意类型的都能实现拷贝,那怎么办呢?我们可以使用内存拷贝函数,不管三七二十一,你在这个内存单元上,我就把你拷贝过去,这样便实现了任意类型的拷贝 。

内存拷贝函数(memcpy)

函数原型

由图可知,memcpy的返回类型是void*,它的形参是(目标地址,需要复制的地址,字节大小)

应用实例

我们依然将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10] = "abcdefg";
    int ret = strlen(arr);//求出字符串的长度
    char brr[10] = { 0 };
    memcpy(brr, arr,ret*sizeof(char));//字节数=个数*数据类型大小
    printf("%s", brr);
    return 0;
}

这次我们试试整型数组能不能拷贝过去。 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int brr[10] = { 0 };
    memcpy(brr, arr, 10*4);//字节数=个数*数据类型大小
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", brr[i]);
    }
    return 0;
}

成功了,这说明memcpy的适用范围强于strcpy,那么memcpy是怎么实现的呢?

memcpy的模拟实现(my_memcpy)

实现样例

void* my_memcpy(void* dest, void* src, size_t count)
{
    void* ret=dest;
    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

首先观察它形式

我们依葫芦画瓢,也写出类似的函数形式。 

void* my_memcpy(void* dest, void* src, size_t count)

具体实现

因为我们用的都是void*来接受参数,目的是保证兼容性(毕竟你不知道使用者使用的时候用的是什么数据类型),但计算机不知道void*指的是什么,所以需要强制类型转换。而强制类型转换,换成什么类型好呢?如果我们用int型,我们知道一个int元素占4个字节,那我们需要复制3个字节的东西咋办?所以,我们用只占一个字节的char型。

*(char*)dest = *(char*)src;

在拷贝完一个字节之后,指针向后移动一个字节

dest = (char*)dest + 1;
src = (char*)src + 1;

那么我们如何控制拷贝多少个字节呢?用while搭配count就行。

while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }

函数运行完了,我们随便返回一个值就行。

return 0;

到此这篇关于详解C语言中strcpy函数与memcpy函数的区别与实现的文章就介绍到这了,更多相关C语言 strcpy memcpy内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言版三子棋游戏

    C语言版三子棋游戏

    这篇文章主要为大家详细介绍了C语言版三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C/C++中输入多组数据的方法

    C/C++中输入多组数据的方法

    这篇文章主要为大家详细介绍了C/C++中输入多组数据的三种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • codeblocks安装及使用超详细图文教程

    codeblocks安装及使用超详细图文教程

    这篇文章主要介绍了codeblocks安装及使用教程详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • C++ 中快排的递归和非递归实现

    C++ 中快排的递归和非递归实现

    这篇文章主要介绍了C++ 中快排的递归和非递归实现的相关资料,需要的朋友可以参考下
    2017-06-06
  • 基于C语言实现简单的走迷宫游戏

    基于C语言实现简单的走迷宫游戏

    这篇文章主要介绍了基于C语言实现简单的走迷宫游戏,用到双向队列,方便在运行完毕后输出经过的点,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C++可执行文件绝对路径值与VS安全检查详解

    C++可执行文件绝对路径值与VS安全检查详解

    这篇文章主要给大家介绍了关于C++可执行文件绝对路径值与VS安全检查的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • C++之IO类,文件输入输出,string流练习题

    C++之IO类,文件输入输出,string流练习题

    这篇文章主要介绍了C++实现IO类的几道数组练习题,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • QT使用udp实现发送与接收图片

    QT使用udp实现发送与接收图片

    这篇文章主要为大家详细介绍了QT如何使用udp协议实现发送与接收图片功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 基于C语言编写一个多功能计算器

    基于C语言编写一个多功能计算器

    这篇文章主要为大家详细介绍了如何基于C语言编写一个多功能计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • C++中的static和const的关键字用法详解

    C++中的static和const的关键字用法详解

    这篇文章主要介绍了C++中的static和const的关键字用法详解,这是一道经常在面试中被问到的知识,本文给大家详细介绍下,需要的朋友可以参考下
    2023-06-06

最新评论