strcpy,sprintf,memcpy的區別

http://jianjiaosun.blog.163.com/blog/static/1361244862010229101318487/數組

 

sprintf 能夠進行額外的格式化
strcpy 會複製直到出現 '' 爲止,可能溢出
strncpy 會複製一個以 '' 結束的字符串,可是若是字符串長度超過指定數量則被截斷,但結果可能不包含 '' 表示結束
memcpy 只負責複製指定數量的 bytes,不處理 '' 的狀況
memmove 在 memcpy 的基礎上對 overlap 的狀況進行了處理。

這些函數的區別在於 實現功能 以及 操做對象 不一樣。

strcpy 函數操做的對象是 字符串,完成 從 源字符串 到 目的字符串 的 拷貝 功能。

snprintf 函數操做的對象 不限於字符串:雖然目的對象是字符串,可是源對象能夠是字符 串、也能夠是任意基本類型的數據。這個函數主要用來實現 (字符串或基本數據類型)向 字符串 的轉換 功能。若是源對象是字符串,而且指定 %s 格式符,也可實現字符串拷貝功能。

memcpy 函數顧名思義就是 內存拷貝,實現 將一個 內存塊 的內容複製到另外一個 內存塊 這一功能。內存塊由其首地址以及長度肯定。程序中出現的實體對象,不管是什麼類型,其最終表現就是在內存中佔據一席之地(一個內存區間或塊)。因 此,memcpy 的操做對象不侷限於某一類數據類型,或者說可 適用於任意數據類型,只要能給出 對象的起始地址和內存長度信息、而且對象具備可操做性便可。鑑於 memcpy 函數等長拷貝的特色以及數據類型表明的物理意義,memcpy 函數一般限於同種類型數據或對象之間的拷貝,其中固然也包括字符串拷貝以及基本數據類型的拷貝。

對於字符串拷貝來講,用上述三個函數均可以實現,可是其實現的效率和使用的方便程度不一樣:函數

  • strcpy 無疑是最合適的選擇:效率高且調用方便。
  • snprintf 要額外指定格式符而且進行格式轉化,麻煩且效率不高。
  • memcpy 雖然高效,可是須要額外提供拷貝的內存長度這一參數,易錯且使用不便;而且若是長度指定過大的話(最優長度是源字符串長度 + 1),還會帶來性能的降低。其實 strcpy 函數通常是在內部調用 memcpy 函數或者用匯編直接實現的,以達到高效的目的。所以,使用 memcpy 和 strcpy 拷貝字符串在性能上應該沒有什麼大的差異。


對於非字符串類型的數據的複製來講,strcpy 和 snprintf 通常就無能爲力了,但是對 memcpy 卻沒有什麼影響。可是,對於基本數據類型來講,儘管能夠用 memcpy 進行拷貝,因爲有賦值運算符能夠方便且高效地進行同種或兼容類型的數據之間的拷貝,因此這種狀況下 memcpy 幾乎不被使用。memcpy 的長處是用來實現(一般是內部實現居多)對結構或者數組的拷貝,其目的是或者高效,或者使用方便,甚或二者兼有。

strcpy和memcpy功能上也有些差異:
好比:
const char *str1="abc\0def";
char str2[7];

首先用strcpy實現:
strcpy(str2,str1)
獲得結果:str2="abc";也就是說,strcpy是以'\0'爲結束標誌的。


再用memcpy實現:
memset(str2,7);
memcpy(str2,str1,7);
獲得結果:str2="abc\0def";
也就是說,memcpy是對內存區域的複製。固然,不只可以複製字符串數組,並且可以複製整型數組等其餘數組。性能

相關文章
相關標籤/搜索