深入理解strcpy與memcpy的區(qū)別
更新時間:2013年05月28日 15:52:23 作者:
本篇文章是對strcpy與memcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
strcpy與memcpy都是標(biāo)準(zhǔn)C庫函數(shù),它們有下面的特點。
strcpy提供了字符串的復(fù)制。即strcpy只用于字符串復(fù)制,并且它不僅復(fù)制字符串內(nèi)容之外,還會復(fù)制字符串的結(jié)束符。
已知strcpy函數(shù)的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內(nèi)存的復(fù)制。即memcpy對于需要復(fù)制的內(nèi)容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_t count );
char * strcpy(char * dest, const char * src) // 實現(xiàn)src到dest的復(fù)制
{
if ((src == NULL) || (dest == NULL)) //判斷參數(shù)src和dest的有效性
{
return NULL;
}
char *strdest = dest; //保存目標(biāo)字符串的首地址
while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內(nèi)容復(fù)制到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) //循環(huán)size次,復(fù)制memFrom的值到memTo中
*tempTo++ = *tempFrom++ ;
return memTo;
}
strcpy與memcpy主要有以下3方面的區(qū)別。
1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
2、復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第3個參數(shù)決定復(fù)制的長度。
3、用途不同。通常在復(fù)制字符串時用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時則一般用memcpy
strcpy提供了字符串的復(fù)制。即strcpy只用于字符串復(fù)制,并且它不僅復(fù)制字符串內(nèi)容之外,還會復(fù)制字符串的結(jié)束符。
已知strcpy函數(shù)的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內(nèi)存的復(fù)制。即memcpy對于需要復(fù)制的內(nèi)容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_t count );
復(fù)制代碼 代碼如下:
char * strcpy(char * dest, const char * src) // 實現(xiàn)src到dest的復(fù)制
{
if ((src == NULL) || (dest == NULL)) //判斷參數(shù)src和dest的有效性
{
return NULL;
}
char *strdest = dest; //保存目標(biāo)字符串的首地址
while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內(nèi)容復(fù)制到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) //循環(huán)size次,復(fù)制memFrom的值到memTo中
*tempTo++ = *tempFrom++ ;
return memTo;
}
strcpy與memcpy主要有以下3方面的區(qū)別。
1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
2、復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第3個參數(shù)決定復(fù)制的長度。
3、用途不同。通常在復(fù)制字符串時用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時則一般用memcpy
您可能感興趣的文章:
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)順序表的進(jìn)階講解
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示2022-04-04如何實現(xiàn)在C++中調(diào)用C函數(shù)
這篇文章主要介紹了如何實現(xiàn)在C++中調(diào)用C函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08C語言字符函數(shù)中的isalnum()和iscntrl()你都知道嗎
這篇文章主要為大家詳細(xì)介紹了C語言字符函數(shù)中的isalnum()和iscntrl(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02