Namespaces
Variants

memcmp

From cppreference.net
< c ‎ | string ‎ | byte
ヘッダーで定義 <string.h>
int memcmp ( const void * lhs, const void * rhs, size_t count ) ;

オブジェクト lhs および rhs が指す先頭 count バイトを比較します。比較は辞書順で行われます。

結果の符号は、比較されるオブジェクト内で異なる最初のバイトのペア(両方とも unsigned char として解釈される)の値の差の符号に基づきます。

lhs および rhs が指すいずれかのオブジェクトの終端を超えてアクセスが発生した場合、動作は未定義です。 lhs または rhs のいずれかがヌルポインタである場合、動作は未定義です。

目次

パラメータ

lhs, rhs - 比較対象のオブジェクトへのポインタ
count - 検査するバイト数

戻り値

負の値は、 lhs が辞書順で rhs より前に現れる場合を示します。

lhs rhs が等しい場合、またはcountがゼロの場合、ゼロを返す。

lhs rhs より辞書順で後に現れる場合、正の値。

注記

この関数は オブジェクト表現 を読み取り、オブジェクト値を読み取るものではなく、通常はバイト配列に対してのみ意味を持ちます:構造体には値が不定のパディングバイトが存在する可能性があり、共用体では最後に格納されたメンバーを超えるバイトの値は不定であり、同じ値に対して2つ以上の表現が存在する型もあります( + 0 - 0 の異なるエンコーディング、または + 0.0 0.0 の異なるエンコーディング、型内部の不定のパディングビット)。

#include <stdio.h>
#include <string.h>
void demo(const char* lhs, const char* rhs, size_t sz)
{
    for(size_t n = 0; n < sz; ++n)
        putchar(lhs[n]);
    int rc = memcmp(lhs, rhs, sz);
    const char *rel = rc < 0 ? " precedes " : rc > 0 ? " follows " : " compares equal ";
    fputs(rel, stdout);
    for(size_t n = 0; n < sz; ++n)
        putchar(rhs[n]);
    puts(" in lexicographical order");
}
int main(void)
{
    char a1[] = {'a','b','c'};
    char a2[sizeof a1] = {'a','b','d'};
    demo(a1, a2, sizeof a1);
    demo(a2, a1, sizeof a1);
    demo(a1, a1, sizeof a1);
}

出力:

abc precedes abd in lexicographical order
abd follows abc in lexicographical order
abc compares equal to abc in lexicographical order

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.24.4.1 memcmp関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.24.4.1 memcmp関数 (p: 266)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.24.4.1 memcmp関数 (p: 365)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.21.4.1 memcmp関数 (p: 328)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.11.4.1 memcmp関数

関連項目

2つの文字列を比較する
(関数)
2つの文字列の指定された文字数を比較する
(関数)