函數:int memcmp (const void *a1, const void *a2, size_t size)
函數memcmp用於比較字串s1與s2的前size個字元。
如果兩上字元塊相同,memcmp將返回0。
函數:int strcmp (const char *s1, const char *s2)
這個函數用來比較s1和s2字串,這個函數將返回一個值,它的符號與第一對不同的字元的比較結果相關。
如果兩個字串相等的話,strcmp將返回0。
如果s1是s2的一個子串的話,s1小於s2
此外還有函數
int strncmp (const char *s1, const char *s2, size_t size)
此函數與strcmp極為類似。不同之處是,strncmp函數是指定比較size個字元。也就是說,如果字串s1與s2的前size個字元相同,函數傳回值為0。
功能比較:
二者都可以用於字串的比較,但是二者是有比較大的差異的,因為strcmp是按照位元組(byte-wise)比較的,並且比較的過程中會檢查是否出現了"/0"結束符,一旦任意一個字串指標前進過程中遇到結束符,將終止比較。而memcmp函數是用於比較兩個記憶體塊的內容是否相等,在用於字串比較時通常用於測試字串是否相等,不常進行byte-wise的字串比較。如果要比較的對象中包含一些由於邊界對齊需求而填入結構對象中的空格、聯合 (union)結束的額外空格、字串所分配的空間未使用完的部分引起的“holes”的話,最好使用memcmp來完成。這些“holes”的內容是不確定的,在執行byte-wise比較時結果也是不明確的。
效率差異:
strcmp比較的字串,而memcmp比較的是記憶體塊,strcmp需要時刻檢查是否遇到了字串結束的 /0 字元,而memcmp則完全不用擔心這個問題,所以memcmp的效率要高於strcmp
使用樣本:
給出一個如下的結構定義:
struct foo
{
unsigned char tag;
union
{
double f;
long i;
char *p;
} value;
};
如果要比較兩個struct foo對象的話,建議最好使用memcmp。
在給出一個字串比較的例子,判斷字串str中前四個中字元是否為 0x80100001,因為0x00對於字串而言,這是個結束符,如果使用strncmp的話strncmp(str,"/x80/x10/x00 /x01",4)的話,實際效果是只判斷了是否含有0x8010,也就是說一旦str中前兩個字元為0x8010就返回0,表示相同了,顯然這是不正確的。此時應該使用memcmp(str,"/x80/x10/x00/x01",4),這樣一來就達到了目的
附:strcmp,strncmp,memcmp的Linux的原始碼
/**
* strcmp - Compare two strings
* @cs: One string
* @ct: Another string
*/
int strcmp(const char *cs, const char *ct)
{
signed char __res;
while (1) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
//比較到結束符/0,時,已經做了__res = *cs - *ct了,但是此時*cs和*ct的值都為/0,所以返回肯定為0
break;
}
return __res;
}
/**
* strncmp - Compare two length-limited strings
* @cs: One string
* @ct: Another string
* @count: The maximum number of bytes to compare
*/
int strncmp(const char *cs, const char *ct, size_t count)
{
signed char __res = 0;
while (count) {
if ((__res = *cs - *ct++) != 0 || !*cs++) //比較到結束符/0,時,已經做了__res = *cs - *ct了,所以不等長度時,肯定返回不為0
break;
count--;
}
return __res;
}
/**
* memcmp - Compare two areas of memory
* @cs: One area of memory
* @ct: Another area of memory
* @count: The size of the area.
*/
int memcmp(const void *cs, const void *ct, size_t count)
{
const unsigned char *su1, *su2;
int res = 0;
for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
if ((res = *su1 - *su2) != 0)
break;
return res;
}
測試程式:
#include
#include
#include
using namespace std;
int main()
{
string str1 = "abcd";
string str2 = "abcdef";
int result1 = 0;
int result2 = 0;
int result3 = 0;
result1 = strcmp(str1.c_str(),str2.c_str());
result2 = strncmp(str1.c_str(),str2.c_str(),7);
result3 = memcmp(str1.c_str(),str2.c_str(),7);
cout<<"strcmp: "<cout<<"strncmp: "<cout<<"memcmp: "<
getchar();
return 0;
}
得出結論:
樣本字串 str1 = "abcd";
srr2 = "abcdef";
(1)strmcp比較結果為非0(不等)。
(2)strncmp,若count <= 4,結果為0(相等);若count > 4,則結果-101(因為最短的字串長度為4,所以比較到第5個字元即結束,值為'/0'的ascii碼減去‘e’的ascii值)。
(3)memcpy,若count <= 4,則結果為0(相等);若count > 4,則結果為-1(比較到第count個位元組即結束)。