strcmp, strncmp和memcmp的區別

2021-09-30 04:50:45 字數 2411 閱讀 5138

函式: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

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)

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)

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)

測試程式:

#include

#include

#include

using namespace std;

int main()

得出結論:

示例字串 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個位元組即結束)。

最大m子段和

最大m子段和問題 給定由n個整數 可能為負 組成的序列a1 a2 a3.an,以及乙個正整數m,要求確定序列的m個不想交子段,使這m個子段的總和最大!設b i,j 表示陣列a的前j項中i個子段和的最大值,並且第i個子段包含a j 1 i m,i j n 則所求的最優值為maxb m,j m j n ...

最小m段和問題

description 給定n個整數組成的序列,現在要求將序列分割為m段,每段子序列中的數在原序列中連續排列。如何分割才能使這m段子序列的和的最大值達到最小?程式設計任務 給定n個整數組成的序列,程式設計計算該序列的最優m段分割,使m段子序列的和的最大值達到最小。input 輸入的第一行有2個正整數...

最大m子段和

51nod 1052 題意描述 給定陣列a,長度為n。給定整數m,求不相交的m段字段和的最大值。當m 1 時 該問題就是最大子段和問題。設dp i 為以a i 結尾的最大子段和,當我們考慮dp i 的時候如果dp i 1 0那麼肯定把a i 接在後面最優,否則,取a i 最優。得到 dp i max...