1. 程式人生 > >memcpy、strcpy、snprintf的區別

memcpy、strcpy、snprintf的區別

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

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是對記憶體區域的複製。當然,不僅能夠複製字串陣列,而且能夠複製整型陣列等其他陣列。

相關推薦

memcpystrcpysnprintf區別

這些函式的區別在於 實現功能 以及 操作物件 不同。 strcpy 函式操作的物件是 字串,完成 從 源字串 到 目的字串 的 拷貝 功能。 snprintf 函式操作的物件 不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。這個函式主

sprintfstrcpystrncpy及 memcpy 函式,請問這些函式功能有什麼區別?

這些函式的區別在於 實現功能 以及 操作物件 不同。 strcpy 函式操作的物件是 字串,完成 從 源字串 到 目的字串 的 拷貝 功能。 snprintf 函式操作的物件 不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。這個函式主要用來實

重寫strstrstrcpymemcpymemsetatof算法

tdi rcp tin amp tof mys log != include 1 #include<stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #incl

【c語言】利用指標模式實現字串函式(strlenstrcatstrstrstrcpystrcmpmemcpymemove)

模擬實現strlen int my_strlen(const char *p) { assert(p != NULL); char *s = p; while (*p) { p++; } r

CString/string /Char轉化Vector分割NewMallocMemsetMemcpyStrcpystatic

#include "stdafx.h" #include <string> // #include <stdlib.h> #include <stdio.h> #include <iostream> using namespa

printffprintfsprintf和snprintf 區別

大小 添加 void std 格式化字符串 指定 stdlib.h () div 都是把格式好的字符串輸出,只是輸出的目標不一樣: 1 printf,是把格式字符串輸出到標準輸出(一般是屏幕,可以重定向)。 2 sprintf,是把格式字符串輸出到指定字符串中,所以參數比p

C字串——庫函式系列(strlenstrcatstrcpystrcmp)

一定義: 字串:字串是由零個或者多個字元組成的有限序列; 子串:字串中任意個連續的字元組成的子序列,並規定空串是任意串的子串,字串本身也是子串之一;“abcdefg”,”abc“就是其子串,但是“ade”不屬於子串範圍。 子序列:不要求字元連續,但是其順序與其在主串中相一致;上例中,“abc

C語言字串函式總結:模擬實現常用的字串類函式(strlenstrcpystrcmp........)

總結:模擬實現常用的字串類函式(strlen、strcpy、strcmp……..) 1. strlen 2. strcpy 3. strcat 4. strstr 5. strchr 6. strcmp 7. memcpy 8. m

strcpystrncpy與memcpy區別與使用方法

flow class created 行為 ons return sizeof creat 數組 今天做題用到了這兩個函數,不是很懂,學習了下~ 轉自http://www.cnblogs.com/houjun/p/4913216.html 本文參考《C 標準庫》編寫。

strcpysprintfmemcpy區別

使用 orm des 內存拷貝 font 行數據 現在 mat 空間 char*strcpy(char *dest, const char *src); 其對字符串進行操作,完成從源字符串到目的字符串的拷貝,當源字符串的大小大於目的字符串的最大存儲空間後,執行該操作會出現段

linux中strcpymemcpy的用法與區別

strcpy提供了字串的複製,以 \0 為結束標誌(即一旦遇到資料值為0的記憶體地址,拷貝過程即結束)。 函式原型如下: char *strcpy(char *dest, const char *src); 其在核心(lib\string.h)原始碼的實現如下: char

strcpystrncpy與memcpy strchr 和 strstr的區別與使用方法

strcpy、strncpy與memcpy的區別與使用方法 strcpy、strncpy、memcpy這三個C語言函式我們在主機程式碼編寫中會很頻繁的使用到,但是三個函式的區別、使用時該注意什麼還是有必要說下的。 本文參考《C 標準庫》編寫。 一、函式說明 1、m

完成字串拷貝(sprintfstrcpymemcpy 函式)函式之間的區別

這些函式的區別在於 實現功能 以及 操作物件 不同。 strcpy 函式操作的物件是 字串,完成 從 源字串 到 目的字串 的 拷貝 功能。 snprintf 函式操作的物件 不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。 這個函式主要用來實現 (字串或基本資料型別)向

strcpymemcpy c語言實現

  以下程式碼沒有考慮重疊的情況 //strcpy char *__strcpy(char *dest, const char *src) { if(dest == NULL || src == NULL) return NULL; char *str

strcpystrncpystrncpy_s和snprintf

1、strcpy 原型宣告: extern char *strcpy(char* dest, const char *src); 依據源串的\0作為結束判斷的,不會檢查需要拷貝的緩衝區的大小,如果目標空間不夠,就有溢位問題。 2、strncpy 原型 char*

strcpymemcpy函式的實現

本文轉載自:strcpy函式實現 大家一般認為名不見經傳strcpy函式實現不是很難,流行的strcpy函式寫法是: char *my_strcpy(char *dst,const char *src) { assert(dst != NULL);

malloccallocrealloc和alloca各種的區別

calloc 一次 單元 不支持 new span 初始化 har 堆棧 需要先包含頭文件 #include"malloc.h" malloc是標準的在堆中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(

getContextPathgetServletPathgetRequestURI的區別

request 執行 result web print 名稱 ati 輸入 pri 假定你的web application名稱為example,你在瀏覽器中輸入請求路徑: https://localhost:8080/example/main/edit.jsp 則執行

(轉載)display:inlineblockinline-block的區別

order label doc class 先後 padding str 如何實現 col display:block就是將元素顯示為塊級元素.   block元素的特點是:  總是在新行上開始;  高度,行高以及頂和底邊距都可控制;  寬度缺省是它的容器的100

call() apply() bind()方法的作用和區別

調用 權威指南 () 使用 func 開始 把他 對象 bsp 從一開始,我是在書上看到關於bind()、call() 和 apply(), 不過長久以來,在工作中與網上接觸到了很多關於這三個方法的使用場景,對這三個方法也算是比較熟悉了。所以把他們的作用和區別簡單闡述一下!