strcpy和memcpy都是标准C库函数。它们有以下的特点。

strcpy提供了字符串的复制。

即strcpy仅仅用于字符串复制。而且它不仅复制字符串内容之外,还会复制字符串的结束符,strcpy_s更安全。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);

返回值是char*是为了链式表达。

memcpy提供了一般内存的复制。即memcpy对于须要复制的内容没有限制,因此用途更广。

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

char *strcpy(char *
dest,
const char *
src)
//
实现src到dest的复制
{
  if ((src==NULL)||(dest
== NULL))
//推断參数src和dest的有效性
  {
      return NULL;
  }
  char *strdest=dest;      //保存目标字符串的首地址
  while ((*strDest++
= *strSrc++)!=
'\0');//把src字符串的内容拷贝到dest下
  return strdest;
}

strcpy_s是strcpy的安全版本号,它之所以安全,是由于其在拷贝字符串的时候会有越界的检查工作。下面是strcpy_s的实现代码,在tcscpy_s.inl文件能够找到:

參考http://www.cnblogs.com/chenkunyun/archive/2012/03/20/2408365.html

errno_t __cdecl _FUNC_NAME(_CHAR *_DEST,
size_t _SIZE,
const _CHAR *_SRC)
{
    _CHAR *p;
    size_t
available;
  
    /* validation section */
    _VALIDATE_STRING(_DEST, _SIZE);
//VALIDATE_STRING应该是验证字符串的合法性,是否以null结尾。

    _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);
//__VALIDATE_POINTER_RESET_STRING应该是记录字符串的原始信息,以便拷贝失败以后恢复
  
    p = _DEST;
    available = _SIZE;
    while
((*p++ = *_SRC++) != 0 && --available > 0)
    {
    }
  
    if
(available == 0)
    {
        _RESET_STRING(_DEST, _SIZE);
//
        _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
//当目的地空间不够时,会依据_VALIDATE_POINTER_RESET_STRING记录的信息恢复字符串,而且(在Debug模式下)以弹出对话框的形式报告错误。
    
    _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
    _RETURN_NO_ERROR;
}

_FILL_STRING完毕在字符串最后加上null结束符的工作

void *memcpy(void *memTo,const void *memFrom,size_t size)
{
  if((memTo==NULL)||(memFrom
== NULL))
//memTo和memFrom必须有效
         return NULL;
  char *tempFrom=(char *)memFrom;            //保存memFrom首地址
  char *tempTo=(char *)memTo;                 //保存memTo首地址     
  while(size-->0)               //循环size次,复制memFrom的值到memTo中
         *tempTo++=*tempFrom++
  return memTo;
}

strcpy和memcpy主要有下面3方面的差别。

1、复制的内容不同。strcpy仅仅能复制字符串,而memcpy能够复制随意内容,比如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不须要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以easy溢出。

memcpy则是依据其第3个參数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy。而须要复制其它类型数据时则一般用memcpy

strcpy和memcpy的差别的更多相关文章

  1. sprintf、strcpy 及 memcpy 函数区别

    这些函数的区别在于 实现功能 以及 操作对象 不同.strcpy 函数操作的对象是 字符串 ,完成 从 源字符串 到 目的字符串 的 拷贝 功能. sprintf 函数操作的对象 不限于字符串 :虽然 ...

  2. strcpy sprintf memcpy 它们之间的区别

    strcpy,sprintf,memcpy的区别 strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能.  snprintf 函数操作的对象 不限于字符串:虽然目 ...

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

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

  4. strcpy vs memcpy

    [本文连接] http://www.cnblogs.com/hellogiser/p/strcpy_vs_memcpy.html [分析] strcpy和memcpy都是标准C库函数,它们有下面的特点 ...

  5. 【转】 strcpy和memcpy的区别

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

  6. 关于strcpy和memcpy

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

  7. strcpy和memcpy的区别

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

  8. strcpy与memcpy的区别

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

  9. strcpy()、memcpy()、memmove()、memset()的内部实现

    一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...

随机推荐

  1. 关于报错stale element reference: element is not attached to the page document处理

    1.现象 在执行脚本时,有时候引用一些元素对象会抛出如下异常 org.openqa.selenium.StaleElementReferenceException: stale element ref ...

  2. javascript 练习题目答案

    //廖雪峰的博客的这个教程的答案//https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb300 ...

  3. LeetCode(55): 跳跃游戏

    Medium! 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...

  4. LeetCode(37): 每k个一组翻转链表

    Hard! 题目描述: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...

  5. django项目验证码(PIL库实现)

    作个记录,这个东东,是可以到处照搬的. WINDOWS下和LINUX下,字体对象获取方式不一样. 为了用户体验,字体大小也重要的. 另外,为了照顾个别字母认不出来的人,提供刷新功能. 一,验证码函数 ...

  6. Zbrush Topogun 备忘

    ====Zbrush==== 1.按住shift 在空白地方移动鼠标左键 就会去到正交视图 2.shift+F可以看一下布线的情况 3.按住shift 点一下画布,松开shift键,就可以旋转画布 4 ...

  7. python爬取百度贴吧帖子

    最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...

  8. Redis简单了解

    Redis介绍 Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库, ...

  9. GitHub安装教程

    第一步是安装两个软件 安装 git for windows这个是一个git的windows系统的命令行版本https://git-scm.com/downloads或者https://pan.baid ...

  10. Map的知识点梳理(不包含collections工具类)

    一:基础公共方法(map不再是简单的加索引,可以直接命名key,通过key进行遍历) 1.常见的map子类 HashTable:底层是哈希表结构.不允许null键和null值,线程同步 HashMap ...