1. 程式人生 > >完成字串拷貝(sprintf、strcpy 及 memcpy 函式)函式之間的區別

完成字串拷貝(sprintf、strcpy 及 memcpy 函式)函式之間的區別

這些函式的區別在於 實現功能 以及 操作物件 不同。

strcpy 函式操作的物件是 字串,完成 從 源字串 到 目的字串 的 拷貝 功能。

snprintf 函式操作的物件 不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。
這個函式主要用來實現 (字串或基本資料型別)向 字串 的轉換 功能。如果源物件是字串,並且指定 %s 格式符,也
可實現字串拷貝功能。

memcpy 函式顧名思義就是 記憶體拷貝,實現 將一個 記憶體塊 的內容複製到另一個 記憶體塊 這一功能。記憶體塊由其首地址以及長度確定。
程式中出現的實體物件,不論是什麼型別,其最終表現就是在記憶體中佔據一席之地(一個記憶體區間或塊)。因此,memcpy 的操作
物件不侷限於某一類資料型別,或者說可 適用於任意資料型別
,只要能給出物件的起始地址和記憶體長度資訊、並且物件具有可操作性即可。
鑑於 memcpy 函式等長拷貝的特點以及資料型別代表的物理意義,memcpy 函式通常限於同種型別資料或物件之間的拷貝,
其中當然也包括字串拷貝以及基本資料型別的拷貝。

對於字串拷貝來說,用上述三個函式都可以實現,但是其實現的效率和使用的方便程度不同:
  • strcpy 無疑是最合適的選擇:效率高且呼叫方便。
  • snprintf 要額外指定格式符並且進行格式轉化,麻煩且效率不高。
  • memcpy 雖然高效,但是需要額外提供拷貝的記憶體長度這一引數,易錯且使用不便;並且如果長度指定過大的話
  • (最優長度是源字串長度 + 1),還會帶來效能的下降。其實 strcpy 函式一般是在內部呼叫 memcpy 函式或者
  • 用匯編直接實現的,以達到高效的目的。因此,使用 memcpy 和 strcpy 拷貝字串在效能上應該沒有什麼大的差別。

對於非字串型別的資料的複製來說,strcpy 和 snprintf 一般就無能為力了,可是對 memcpy 卻沒有什麼影響。但是,
對於基本資料型別來說,儘管可以用 memcpy 進行拷貝,由於有賦值運算子可以方便且高效地進行同種或相容型別的資料之間的拷貝,
所以這種情況下 memcpy 幾乎不被使用。memcpy 的長處是用來實現(通常是內部實現居多)對結構或者陣列的拷貝,其目的是或者高效,
或者使用方便,甚或兩者兼有。