memcmp

来自cppreference.com
< c‎ | string‎ | byte
在标头 <string.h> 定义
int memcmp( const void* lhs, const void* rhs, size_t count );

比较 lhsrhs 所指向对象的开头 count 个字节。按字典序进行比较。

结果的符号是在被比较对象中相异的首对字节的值(都转译成 unsigned char)之差的符号。

若在 lhsrhs 所指向的任一对象结尾后发生访问,则行为未定义。若 lhsrhs 为空指针则行为未定义。

参数

lhs, rhs - 指向要比较的对象的指针
count - 要检验的字节数

返回值

lhs 按字典序先于 rhs 出现,则为负值。

lhsrhs 比较相等,或 count 为零则为零。

lhs 按字典序晚于 rhs 出现,则为正值。

注解

此函数读取对象表示,而非对象值,而且典型地只对字节数组有意义:结构体可以含有填充字节而其值不确定,存储于联合体最近存储成员后的任何字节的值是不确定的,且一个类型可以对相同值拥有二种或多种表示(对于 +0-0+0.00.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 The memcmp function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.24.4.1 The memcmp function (第 266 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.24.4.1 The memcmp function (第 365 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.21.4.1 The memcmp function (第 328 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.11.4.1 The memcmp function

参阅

比较两个字符串
(函数)
比较两个字符串的一定数量字符
(函数)