1. 程式人生 > >memcpy與strcpy區別,memcmp與strcmp的區別

memcpy與strcpy區別,memcmp與strcmp的區別

memcpy 

c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。

中文名 記憶體拷貝函式 

外文名 memcpy 

功能 拷貝n個位元組 

返回值 指向dest的指標

函式原型

void *memcpy(void *dest, const void *src, size_t n);

功能

從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中

所需標頭檔案

C語言:#include<string.h>

C++:#include<cstring>

返回值

函式返回指向dest的指標。

說明

1.source和destin所指的記憶體區域可能重疊,但是如果source和destin所指的記憶體區域重疊,那麼這個函式並不能夠確保source所在重疊區域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區域。函式返回指向destin的指標.

2.如果目標陣列destin本身已有資料,執行memcpy()後,將覆蓋原有資料(最多覆蓋n)。如果要追加資料,則每次執行memcpy後,要將目標陣列地址增加到你要追加資料的地址。

注意:source和destin都不一定是陣列,任意的可讀寫的空間均可。

區別

strcpy和memcpy主要有以下3方面的區別。

1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。

3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

memcmp

memcmp是比較記憶體區域buf1和buf2的前count個位元組。該函式是按位元組比較的。

外文名 memcmp

功能 比較buf1和buf2的前count個位元組

所需標頭檔案 #include <string.h>

返回值 當buf1<buf2時,返回值<0

函式原型

int memcmp(const void *buf1, const void *buf2, unsigned int count);

功能

比較記憶體區域buf1和buf2的前count個位元組。

所需標頭檔案

#include <string.h>或#include<memory.h>

返回值

當buf1<buf2時,返回值<0

當buf1==buf2時,返回值=0

當buf1>buf2時,返回值>0

說明

該函式是按位元組比較的。

例如:

s1,s2為字串時候memcmp(s1,s2,1)就是比較s1和s2的第一個位元組的ascII碼值;

memcmp(s1,s2,n)就是比較s1和s2的前n個位元組的ascII碼值;

如:char *s1="abc";

char *s2="acd";

int r=memcmp(s1,s2,3);

就是比較s1和s2的前3個位元組,第一個位元組相等,第二個位元組比較中大小已經確定,不必繼續比較第三位元組了。所以r=-1

區別

對於memcmp(),如果兩個字串相同而且count大於字串長度的話,memcmp不會在\0處停下來,會繼續比較\0後面的記憶體單元,直到_res不為零或者達到count次數。      

  對於strncmp(),由於((__res = *cs - *ct++) != 0 || !*cs++)的存在,比較必定會在最短的字串的末尾停下來,即使count還未為零。具體的例子:      

  char a1[]="ABCD";   

  char a2[]="ABCD";       

  對於memcmp(a1,a2,10),memcmp在兩個字串的\0之後繼續比較   

  對於strncmp(a1,a2,10),strncmp在兩個字串的末尾停下,不再繼續比較。       

  所以,如果想使用memcmp比較字串,要保證count不能超過最短字串的長度,否則結果有可能是錯誤的。

2、strncmp("abcd", "abcdef", 6) = 0。比較次數是一樣的:   

   memcmp:在比較到第5個字元也就是'\0',*su1 - *su2的結果顯然不等於0,所以滿足條件跳出迴圈,不會再進行後面的比較。我想在其他情況下也一樣。   

   strncmp:同樣的道理再比較到第5個字元時結束迴圈,其實strncmp中“!*cs++”完全等同於“!*ct++”,其作用僅在於當兩個字串相同的情形下,防止多餘的比較次數。

(本文為作者從網上相關資料整理所得)