字串拷貝函數 sprintf、strcpy 及 memcpy 的區別

來源:互聯網
上載者:User

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


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


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


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


對於字串拷貝來說,用上述三個函數都可以實現,但是其實現的效率和使用的方便程度不同:

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



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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.