一.函数介绍:
1、memcpy
函数原型:extern void *memcpy(void *dest, const void *src, size_t count);
用法:#include<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
注意:和strcpy相比,memcpy不是遇到’/0’就结束,而是一定会拷贝完n个字节。

函数实现代码:

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

assert(dest!=NULL&&src!=NULL);
     char *tmp = dest;
     const char *s = src;

while (count--)
     *tmp++ = *s++;
     return dest;
}

2、memset
函数原型:extern void *memset(void *s, int c, size_t n)
功能:将已开辟内存空间s的首n个字节的值设为值c。将s中的前n个字符替换为c,并返回s。
memset常用于内存空间的初始化。
memset的深刻内涵:用来对一段内科空间全部设置为某个字符,一般用在对定义的字符串进行初始化为:memset(a, ‘/0’, sizeof(a));

函数实现代码:

void * memset(void* buffer, int c, int count) 

     char * buffer_p=(char*)buffer; 
     assert(buffer != NULL); 
     while(count-->0) 
         *buffer_p++=(char)c; 
     return buffer; 
}

3、memmove

void *memmove(void *s, const void *ct, size_t n)
与memcpy类似,所不同的是,当对象重叠时,该函数仍能正确执行,具体的实现代码在下面有详细解释。

4、strncpy
函数原型:extern char *strncpy(char *dest, char *src, int n); 
用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
        如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
        如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
        src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针(该指向dest的最后一个元素)
实现代码:

char * strncpy(char * dest,const char *src,size_t count)
{    
    char *tmp = dest;
    while (count-- && (*dest++ = *src++) != '/0')
    /* nothing */;
    return tmp;
}

5、strcpy:

函数原型:extern char *strcpy(char *dest,char *src);

头文件:string.h

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。如果src的结尾不是'/0'的话,那么系统会在src的结尾处自动加一个'/0'。例如:

#include <stdio.h>
#include <string.h>

void main()
{
 char array1[5]={'1','2','3','4','5'};
 char array2[5]={'a','b','c'};
 strcpy(array1,array2);
 printf("%s/n",array1);
}

输出结果:abc

函数实现代码:

char *strcpy(char *strDest, const char *strSrc) 

     assert((strDest!=NULL) && (strSrc !=NULL)); 
     char *address = strDest;     
     while( (*strDest++ = * strSrc++) != '/0') 
        NULL ; 
     return address ;       
}

二.下面重点来讲解memcpy和memmove的区别:
这两个函数的函数原型(除了名字)是一样的:
void *memcpy(void *dst, const void *src, size_t count):
void *memmove(void *dst, const void *src, size_t count);
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)

即:dst<=src 且 dst+count>src

即:src<dst且src+count>dst
下面将针对这两种情况来讨论。针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);结果是:
4567896789

针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a+4, a, sizeof(int)*6)

memmove(a+4, a, sizeof(int)*6)

下面是这两个函数的具体实现:

void *memcpyMy(void *dst, const void *src, size_t count)

{
       void *address = dst;

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

return dst;
}

void *memmoveMy(void *dst, const void *src, size_t count)

{
       void *address = dst;

if (dst <= src || (char*)dst >= (char *)src + count)
      {
            while (count --)
           {
                *(char *)address = *(char *)src;
                address = (char *)address + 1;
                src = (char *)src + 1;
            }
       }

else

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

return dst;
}
以上两段代码是在vc6.0下通过测试的。

细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数相关推荐

  1. strcpy,strncpy,memcpy,memmove

    ❤️强烈推荐人工智能学习网站❤️ 这4个字符串处理函数是我们经常用到的,下面我们来了解释一下它们之间的区别. strcpy:只用于字符串的复制,以\0为结束符,且\0也一并拷贝过去.不需要在末尾加上\ ...

  2. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...

  3. c语言switch语句嵌套,浅谈c语言中switch语句的嵌套使用

    switch语句是一种分支控制语句,它的应用在程序设计中起到了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套使用更是让初学者难以理解.本文通过介绍switch嵌套语句的形 ...

  4. c语言switch语句最大嵌套数,浅谈C语言中switch 语句的嵌套使用

    浅谈C语言中switch 语句的嵌套使用 作者:未知 [摘要]switch语句是一种分支控制语句,它的应用在程序设计中起至了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套 ...

  5. c语言中math的库函数,C语言中math.h库中的常用函数

    C语言中math.h库中的常用函数 int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fa ...

  6. 库函数strcpy、memcpy和memset

    编写一个函数,作用是把一个char组成的字符串循环右移n个. void LoopMove(char pStr, int steps) { int n = strlen(pStr) - steps; c ...

  7. 《strcmp,strcpy,memcpy,memmove等函数模拟实现》

    模拟实现常见字符串函数比如:strcmp,strcpy,memcpy,memmove等函数 1.模拟实现memcpy函数 2.模拟实现memmove函数 3.模拟实现strstr函数 4.模拟实现st ...

  8. linux strcpy 用法,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...

    今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...

  9. c语言中管道符作用,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...

    今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...

最新文章

  1. Linux中如何使用mysql和php_hi 感恩节——Linux基础教程之mysql和php
  2. [Android] ListView关于adapter多种view设置
  3. 比较重量 网易2016实习研发工程师编程题
  4. linux opencv cmake,OpenCV基础篇之使用CMake管理工程
  5. onmounted vue3_基于项目时间阐述vue3.0新型状态管理和逻辑复用方式
  6. java中的lastIndexOf( )函数是什么意思
  7. 复合型网络拓扑结构图_网络拓扑结构大全和图片星型总线型环型树型分布式网状拓扑结构...
  8. 几种有趣的Magic Matrix
  9. MATLAB计算图片的标准差与方差 MEAN STD
  10. linux把终端嵌入桌面,在你的Ubuntu Linux桌面上嵌入终端窗口
  11. 【YOLO3D】:端到端3D点云输入的实时检测
  12. 2017-Appearance-and-Relation Networks for Video Classification视频分类中的外观与关系网络
  13. 吊打面试官系列之:移动APP UI面试必备知识点,果然路转粉。
  14. 微信无法连接到服务器1-10091,微信能登录但是被限制功能了怎么解封
  15. 泛泛而谈:白话分布式一致性与共识算法
  16. MySQL数据库的主主同步配置
  17. css锚点定位不准确问题
  18. 如何在文本中添加多条线
  19. 【JS】1126- 如何更好的取消一个promise?
  20. 3D audio 及 Virtual Surround 算法

热门文章

  1. docker 入门教程指南
  2. Python-OpenCV 杂项(一):图像绘制
  3. ROS探索总结(十)(十一)(十二)——语音控制 机器视觉 坐标系统
  4. Python、Lua和Ruby比较——脚本语言大P.K.
  5. 图像处理与计算机视觉:基础,经典以及最近发展(4)图像处理与分析
  6. 图像检索中BOW和LSH的一点理解
  7. 数字图像处理:第十一章基于特征向量的变换
  8. VMware Workstation中安装linux系统(CentOS)超详细
  9. 保障IDC安全:分布式HIDS集群架构设计
  10. linux下如何实现mysql数据库每天自动备份定时备份