首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点:

1.判断指针的有效性

2.将复制后的指针地址返回,为了支持链式操作

3.不要忘记将字符串最后一个自负'\0'复制给dest

4.注意原字符串类型为const,保证在函数内部不会被修改

char* myStrcpy(char* dest, const char* src){
assert(dest!=NULL && src !=NULL);
char* r = dest;
while((*dest++ = *src++)!='\0') ;
return r;
}

然后来看memcpy,目的是实现内存的复制,这里就不仅仅限制于字符串复制,并且规定了复制内存的大小

void* myMemcpy(void* dest, const void* src, size_t n){
assert(dest!=NULL && src !=NULL);
void* r = dest;
while(n--){
*dest++ = *src++;
}
return r;
}

最后来看memmove,实现的功能,与mencpy是一样的,不同的地方在于,其处理了目的内存与原内存重叠的情况。

void* myMemmove(void* dest, const void* src, size_t n){
assert(dest!=NULL&& src!=NULL);
void* r = dest;
if(dest<src || dest>str+n){ //no recover
while(n--){
*dest++ = *src++;
}
}else{ // with recover, copy from end to begin
dest = dest+n;
src = src + n;
while(n--){
*(--dest) = *(--src);
}
}
return r;
}

总体看来,strcpy, memcpy和memmove都是对内存进行复制操作的,不同之处在于,strcpy强调对于字符串的处理,memcpy要给定复制内容的大小,memmove则注意了内存重叠的情况

strcpy, mencpy, memmove三者区别的更多相关文章

  1. memset,memcpy,strcpy的使用与区别

    1.memset 原型:   extern void *memset(void *buffer, int c, int count); 功能:   把buffer所指内存区域的前count个字节设置成 ...

  2. css学习--inline-block详解及dispaly:inline inline-block block 三者区别精要概括

    *知识储备: 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行. 块级元素:是可以控制宽和高.margin等,并且会换行. 1.inline-block 详解 (1)一句话就是在 ...

  3. strcpy与memcpy的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

  4. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  5. @ApiParam @PathVariable @RequestParam三者区别

    转载:https://www.cnblogs.com/xu-lei/p/7803062.html @ApiParam @PathVariable @RequestParam三者区别 1.@ApiPar ...

  6. @Requestbody@ApiParam @PathVariable @RequestParam三者区别

    一.问题描述 由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口.接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报 ...

  7. [转帖]C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中字典集合HashTable.Dictionary.ConcurrentDictionary三者区别 https://blog.csdn.net/yinghuolsx/article/detail ...

  8. Jquery元素筛选、html()和text()和val三者区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. strcpy和memcpy的区别(转载)

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

随机推荐

  1. mvc 客户端验证

    @model MvcApplication1.Models.ViewClass @{ ViewBag.Title = "View2"; } @******引用这两个js实现客户端的 ...

  2. mysql数据库 数据类型

    char(m) 固定长度字符串,m<=255:处理速度快: varchar(m) 可变长度字符串,m<=255: int(m) 整数型,-214783647到214783648之间,使用u ...

  3. php variance

    function variance ($a) { /** variable and initializations */ $the_variance = 0.0; $the_mean = 0.0; $ ...

  4. c#接口定义与应用

    public interface IBankAccount //只能加public修饰符,或者什么都不加 { void Playin(decimal money); //函数前不加任何修饰符号 boo ...

  5. Linux系统下用C语言获取MAC地址

    最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下.如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址 ...

  6. python操作redis-事务

    #!/usr/bin/python #!coding: utf-8 import redis import sys if __name__=="__main__": try: co ...

  7. 小记:对Android网络下载工具的初步封装!(包括json,字符串下载(volley),和图片下载(glide))

    import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkIn ...

  8. 一步一步学python(三) - 使用字符串

    1.基本字符串操作 序列和元组的索引.分片.乘法.判断成员资格.求长度.取最小值和最大值对字符串同样适用. 字符串是不可变的 2.字符串格式化 %左侧放字符串右侧放格式化的值.一般情况下使用元组 fo ...

  9. Delphi HTML5 Canvas组件

    最近去sourceforge瞎转悠,突然发了一个组件,关于Delphi下Html5的canvas的组件,大概浏览了一下源码,竟然是纯粹的Pascal代码,也就说完全的Delphi代码.不敢独享,现在上 ...

  10. win7系统怎样备份

    利用系统自带的备份还原 1 这种方法的缺点是如果以后系统出现问题,无法进入系统的话,就无法恢复系统了.首先我们点击开始菜单,打开控制面板! 2 在控制面板中点击系统和安全! 3 我们选择备份和还原中的 ...