strcmp, strncmp和memcmp的區別

函數: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個字節即結束)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章