mencpy、snprintf和strcpy對比

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

strcpy 函數操作的對象是 字符串,完成 從 源字符串 到 目的字符串 的 拷貝 功能。函數原型:extern char *strcpy(char dest[],const char *src);

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

備註:int snprintf(char *str, size_t size, const char *format, ...);

將可變個參數(...)按照format格式化成字符串,然後將其複製到str中
          (1) 如果格式化後的字符串長度 < size,則將此字符串全部複製到str中,並給其後添加一個字符串結束符('\0');
          (2) 如果格式化後的字符串長度 >= size,則只將其中的(size-1)個字符複製到str中,並返回一個負值,並給其後添加一個字符串結束符('\0')
函數返回值:


memcpy 函數顧名思義就是 內存拷貝,實現 將一個 內存塊 的內容複製到另一個 內存塊 這一功能。內存塊由其首地址以及長度確定。程序中出現的實體對象,不論是什麼類型,其最終表現就是在內存中佔據一席之地(一個內存區間或塊)。因此,memcpy 的操作對象不侷限於某一類數據類型,或者說可 適用於任意數據類型,只要能給出對象的起始地址和內存長度信息、並且對象具有可操作性即可。鑑於 memcpy 函數等長拷貝的特點以及數據類型代表的物理意義,memcpy 函數通常限於同種類型數據或對象之間的拷貝,其中當然也包括字符串拷貝以及基本數據類型的拷貝。(void *memcpy(void *dest, const void *src, size_t n);從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中

void *memset(void *s,int ch,size_t n);
函數解釋:將 s 中前 n 個字節用 ch 替換並返回 s 。
memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。

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

對於非字符串類型的數據的複製來說,strcpy 和 snprintf 一般就無能爲力了,可是對 memcpy 卻沒有什麼影響。但是,對於基本數據類型來說,儘管可以用 memcpy 進行拷貝,由於有賦值運算符可以方便且高效地進行同種或兼容類型的數據之間的拷貝,所以這種情況下 memcpy 幾乎不被使用。memcpy 的長處是用來實現(通常是內部實現居多)對結構或者數組的拷貝,其目的是或者高效,或者使用方便,甚或兩者兼有。
發佈了44 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章