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. android margin--负的margin的使用

    通常情况下,如果我们想要两个控件实现重叠的效果,一般都是使用FrameLayout 或者RelativeLayout布局.其实,如果设置两个控件的margin值为负数,也能实显控件重叠的效果. 先展示 ...

  2. [学习笔记]JS计数器,闭包和localStorage

    1.前言 Javascript也算用了挺久了,为了得到一个变量,类似Java的静态变量的功能,我想到了很早以前学习JS的闭包,还有做俄罗斯方块的排行榜用到LocalStorage技术,所以想总结一下, ...

  3. PYTHON-函数的定义与调用,返回值,和参数

    函数基础'''1. 什么是函数 具备某一功能的工具->函数 事先准备工具的过程--->函数的定义 遇到应用场景,拿来就用---->函数的调用 函数分类两大类: 1. 内置函数 2. ...

  4. CSS的vertical-align

    转载自https://blog.csdn.net/FE_dev/article/details/75948659 说明 vertical-align属性,是CSS属性中一个比较重要的属性,也是比较不好 ...

  5. python用来生成的包含电话号码的python代码

    # -*- coding:utf-8 -*-#用python生产包含电话号码的代码temp = """arr = %sindex = %stel = ''for i in ...

  6. lnmp创建站点

    一.创建站点 1.输入命令 lnmp vhost add 输入域名 www.xxx.com 回车 回车 回车 y创建 n不创建 网站如果有目录权限 更改目录权限 chown -R www:www /h ...

  7. Lucene.Net简单例子-01

    前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net  PanGu  PanGu.HightLight  PanGu.Luc ...

  8. 数据库中的null用法

  9. mysql操作查询结果case when then用法举例

    举例1: 使用该查询,得出iFavoriteID,iFavUserType ,cUser,iArticleID,dFavoriteTime五个字段的值: SELECT iFavoriteID,CASE ...

  10. poj 1321 棋盘问题(n行中放任意k行)

    n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列 Sample Input 2 1#.  //# 可放.#4 4...#..#..#..#...-1 -1Sample Output 21 # i ...