strcpy和memcpy的差别

  • Post author:
  • Post category:其他



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