1. 程式人生 > >memcpy和strcpy區別

memcpy和strcpy區別

strcpy和memcpy主要有以下3方面的區別。
1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符”\0”才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

memcpy

函式原型:void * memcpy (void * dest, const void * src, size_t n);

功能:從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中

標頭檔案: #include < string.h >

strcpy

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

功能:把從src地址開始且含有NULL結束符的字串賦值到以dest開始的地址空間,返回dest(地址中儲存的為複製後的新值)。
要求:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

標頭檔案: #include < string.h >

原始碼實現

char * strcpy(char * dest, const char * src) // 實現src到dest的複製
{   if ((src == NULL) || (dest == NULL)) //判斷引數src和dest的有效性  return NULL;     char * strDest = dest; //儲存目標字串的首地址   char * strSrc = src;      while ((*strDest++ = *strSrc++)!='\0'); //把src字串的內容複製到dest下   return strdest; } 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++ ;   //*tempTo = *tempFrom ;   //tempTo++;   //tempFrom++; }   return memTo; } //(1)可以拷貝任何型別的物件,因為函式的引數型別是void*(未定義型別指標),也就是說傳進去的實參可以是int*,short*,char*等等, //(2)由於函式拷貝的過程是一個位元組一個位元組的拷貝的,所以實際操作的時候要把void*強制轉化為char*,這樣在指標加的時候才會保證每次加一個位元組 //(3)如果初始化的時候: char dest[1024] = "12345666";//{0}; const char src[5] = "3333"; 如果用memcpy1(dest,src,sizeof(src));則printf(dest);出來是3333; 如果用memcpy1(dest,src,4);則printf(dest);出來是33335666; 而如果傳4個字元,'/0'是第五個字元,那就遇到dest[1024] 的'/0'結束,所以是33335666 字串的'/0'一定要注意!!!