memcpy_s strncpy 目標(biāo)緩沖區(qū) 小于 實(shí)際緩沖區(qū)
目標(biāo)緩沖區(qū) 小于 實(shí)際緩沖區(qū)
char *name = "1234567890";
char name2[6]={0};
memcpy_s( name2 , sizeof(name2) , name, strlen(name));
動(dòng)態(tài)執(zhí)行失敗 (DEBUG ASSERTION FAILED !) 運(yùn)行庫(kù)和調(diào)試庫(kù)都會(huì)提示出錯(cuò).
注意: 指針sizeof( 指針 ) = 4
strncpy(name2,name ,sizeof(name) ); 打印name2 1234
strncpy(name2,name ,strlen(name) ); 打印name2 123456IOIPNUUY
優(yōu)化這個(gè)語(yǔ)句,盡量拷貝內(nèi)容
strncpy(name2,name , strlen(name)>sizeof(name2)? sizeof(name2): strlen(name) );
目標(biāo)緩沖區(qū) 小于 實(shí)際緩沖區(qū)
strncpy(name2,name ,sizeof(name2)-1 );
sizeof(name2)-1 ------------>讓最后一個(gè)name2字符留給\0 否則這個(gè)字符也被拷貝了.
看一下LINUX下的兩個(gè)函數(shù)的源代碼,印象會(huì)更加深刻一些
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp = (char *) dest, *s = (char *) src;
while (count--)
*tmp++ = *s++;
return dest;
}
char * strcpy(char * dest,const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
老實(shí)講,這兩個(gè)函數(shù)長(zhǎng)得是很帥
參考
http://stackoverflow.com/questions/4593907/difference-between-strncpy-and-memcpy
posted on 2013-09-18 00:12 小高 閱讀(464) 評(píng)論(0) 編輯 收藏 所屬分類: C