memcmpの使い方

2424 ワード

memcmpは、メモリ領域buf 1とbuf 2を比較する前countバイトである.この関数はバイトで比較されます
きほんプロトタイプ
int memcmp(const void *buf1, const void *buf2, unsigned int count);
パラメータ
buf 1-比較列1 buf 2-比較列2 count-比較バイト数
機能
メモリ領域buf 1とbuf 2の前countバイトを比較して、アルファベットの大文字と小文字を区別します.
戻り値
buf 1
buf 1=buf 2の場合、戻り値=0
buf 1>buf 2の場合、戻り値>0
例を挙げる
#include 

#include 

#include

main()

{

char *s1="Hello, Programmers!";

char *s2="Hello, programmers!";

int r;

clrscr();

r=memcmp(s1,s2,strlen(s1));

if(!r)

printf("s1 and s2 are identical");

else if(r<0)

printf("s1 less than s2");

else

printf("s1 greater than s2");

return 0;

}

説明:
この関数はバイトで比較されます.
例:
s 1,s 2が文字列の場合memcmp(s 1,s 2,1)は、s 1とs 2の最初のバイトを比較するascII符号値である.
memcmp(s 1,s 2,n)は、s 1とs 2の前のnバイトを比較するascII符号値である.
例えば、char*s 1=「abc」;
char *s2="acd";
int r=memcmp(s1,s2,3);
つまり、s 1とs 2の最初の3バイトを比較する、最初のバイトは等しく、2番目のバイトの比較ではサイズが確定しているので、3番目のバイトを比較する必要はないのでr=-1である. 
隠れた危険
次のコードを見てください
#include 

#include 

typedef struct padding_type 

{

 short m1;

 int m2;

} padding_type_t;

int main()

{

 padding_type_t a,b;

 a.m1=0;

 a.m2=0;

 memset(&b, 0, sizeof(b));

 if (0 == memcmp(&a, &b, sizeof(a))) 

 {

 cout< }

  else 

 {

    cout< }

 return 0;

}

結果は何ですか?No equal!どうしてそうなの?実は経験のある開発はすぐに反応します.これは位置合わせによるものです.そう、struct padding_type->m 1のタイプはshort型であり,m 2のタイプはint型であり,自然整列の原則に従う.padding_typeの各メンバーは4バイトに整列する必要があります.したがって、コンパイラはm 1の後ろに2つのpaddingバイトを挿入し、paddingのバイトの値はランダムである.すなわち、a中のpaddingバイトの値はランダムであり、b中のpaddingはクリアされる.したがってmemcmpyを用いてこの2つの構造体を比較すると,戻り値は等しくない. 
この例から,memcmpのようなバイト比較は構造体を比較する際に使用しないことを覚えておく.これらの位置合わせを保証したpaddingバイトがクリアされない限り.そうでなければ、思いがけない結果が得られます.
リンク:http://baike.baidu.com/view/1026877.htm?fr=aladdin