C memcmp() 语法
memcmp() 是 C 语言 <string.h> 标准库的一个函数,用于比较 “两个内存区域” 中 “指定字节数量” 的内容。它执行的是二进制比较,即逐个字节比较内存中的值。
语法:
memcmp(s1, s2, n)说明:
memcmp() 函数接收以下 3 个参数。
s1(const void*):指向第 1 个要比较的内存块的指针。这是一个 const void* 指针,表示它指向的数据不会被修改。s2(const void*):指向第 2 个要比较的内存块的指针。这是一个 const void* 指针,表示它指向的数据不会被修改。n(size_t):要比较的字节数。
memcmp(s1, s2, n) 会从 s1 和 s2 指向的内存位置开始,逐个字节地比较它们的内容,直到找到第一对不相等的字节,或者已经比较了 n 个字节。比较是按照字节的数值大小进行的(通常是无符号字符 unsigned char 的值)。
提示: memcmp 是 “memory compare” 的缩写。
C memcmp() 摘要
| 使用频率 | 高 |
|---|---|
| 修改字符串 | 否 |
| 官方文档 | 查看 |
C memcmp() 示例
接下来,我们通过几个简单的例子来讲解一下 C memcmp() 函数是如何使用的。
示例 1:memcmp() 比较两个相等的整数数组
#include <stdio.h>
#include <string.h>
int main(void)
{
int arr1[] = {10, 20, 30, 40, 50};
int arr2[] = {10, 20, 30, 40, 50};
size_t size = sizeof(arr1); // 比较整个数组的字节数
int result = memcmp(arr1, arr2, size);
if (result == 0) {
printf("在前 %zu 个字节内,arr1 和 arr 2 相等。", size);
} else if (result < 0) {
printf("在前 %zu 个字节内,arr1 小于 arr 2。", size);
} else {
printf("在前 %zu 个字节内,arr1 大于 arr 2。", size);
}
return 0;
}运行结果如下。
在前 20 个字节内,arr1 和 arr 2 相等。分析:
在这个例子中,我们使用 memcmp() 比较两个整型数组的内容。由于数组 arr1 和 arr2 的所有字节都是相同的,因此 memcmp() 会返回 0。
示例 2:memcmp() 比较两个不同的浮点数数组
#include <stdio.h>
#include <string.h>
int main(void)
{
float arr1[] = {1.1f, 2.2f, 3.3f};
float arr2[] = {1.1f, 2.2f, 4.4f};
size_t size = sizeof(arr1);
int result = memcmp(arr1, arr2, size);
if (result == 0) {
printf("在前 %zu 个字节内,arr1 和 arr 2 相等。", size);
} else if (result < 0) {
printf("在前 %zu 个字节内,arr1 小于 arr 2。", size);
} else {
printf("在前 %zu 个字节内,arr1 大于 arr 2。", size);
}
return 0;
}运行结果如下。
在前 12 个字节内,arr1 小于 arr 2。分析:
memcmp() 会按字节来比较内存,即使是浮点数也会逐个字节比较其二进制表示。在这个例子中,虽然前几个字节相同,但在表示 3.3f 和 4.4f 的字节处出现了不同,因此 memcmp() 返回非零值。
示例 3:memcmp() 比较两个字符串的一部分
#include <stdio.h>
#include <string.h>
int main(void)
{
const char str1[] = "abcdefg";
const char str2[] = "abcfg";
size_t size = 4; // 只比较前 4 个字节
int result = memcmp(str1, str2, size);
if (result == 0) {
printf("在前 %zu 个字节内,str1 和 str2 是相等的。", size);
} else if (result < 0) {
printf("在前 %zu 个字节内,str1 小于 str2。", size);
} else {
printf("在前 %zu 个字节内,str1 大于 str2。", size);
}
return 0;
}运行结果如下。
在前 4 个字节内,str1 小于 str2。分析:
memcmp() 可以用来比较字符串的一部分,这里我们指定比较前 4 个字节。在前 3 个字节中,两个字符串的内容相同("abc")。但在第 4 个字节处,str1 是 'd',str2 是 'f',由于 'd' 的 ASCII 值小于 'f',因此 memcmp() 返回一个负数,表示 str1 小于 str2。
注意,memcmp() 不会因为遇到 '\0' 而停止比较,它会一直比较指定的 n 个字节。
memcmp() 与 strcmp() 的区别
在 C 语言中,memcmp() 和 strcmp() 都可以用于比较内存内容,但它们之间存在重要区别:
strcmp():专门用于比较 “以空字符 '\0' 结尾的字符串” 。它会从字符串开头逐个字符进行比较,直到遇到第一个不相等的字符,或到达任何一个字符串的终止符 '\0'。比较是基于字符的 ASCII 码(或具体字符集)进行的。memcmp():用于比较 “任意字节块” 。它会比较指定的 n 个字节,而不关心是否遇到终止符 '\0'。
memcmp() 的应用场景
在实际开发中,memcmp() 函数主要用于以下场景:
- 比较非字符串数据类型(如整数数组、浮点数数组、结构体)的内容是否完全相同。
- 比较包含嵌入式 '\0' 字符的二进制数据。
- 实现需要精确字节比较的底层操作。
- 在处理文件内容或网络数据时,比较指定长度的字节块。
