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++”,其作用僅在於當兩個字串相同的情形下,防止多餘的比較次數。
(本文為作者從網上相關資料整理所得)