memcmp
原型:
int memcmp(const void *ptr1, const void*ptr2, unsigned int count);
功能:
memcmp用于比较内存区域ptr1和ptr2的前count个字节,是按字节进行比较的。
头文件:
string.h 或 memory.h
返回值:
< 0 :ptr1和ptr2所指内存中第一个不相等的字节有*((char*)ptr1+x) < *((char*)ptr2+x)> 0 :ptr1和ptr2所指内存中第一个不相等的字节有*((char*)ptr1+x) > *((char*)ptr2+x)
= 0 :ptr1和ptr2所指的内存块中前count个字节都相等
说明:
1、函数的返回条件是:比较次数达count次或者*((char*)ptr1+x) - *((char*)ptr2+x)的值不为零(即两个块内存中第x字节不相等)。2、函数是按字节进行比较的,如果还没有达到上述返回条件,即使遇到'\0'也不会停止比较。而判断规则是按照ASCII码表中字母的顺序进行比较的,即'a'的值为97,'A'的值为65,因此'a'比'A'大。
3、调用函数时如果参数为结构体,则需要确保结构体中的填充字节被清零。例子:
typedef struct memcmp_test {
short data1;
int data2;
} memcmp_test_t;
int main()
{
memcmp_test_t test_1 = { 0, 0};
memcmp_test_t test_2;
memset( &test_2, 0, sizeof( test_2));
int judge = memcmp( &test_1, &test_2, sizeof(memcmp_test_t));
if( 0 == judge)
printf("they are equal\n");
else
printf("they are not equal\n");
return 0;
}
在平台windows7 x64上,gcc (GCC) 4.7.2编译后输出结果为: they are equal;
在平台windows7 x64上,VC++6.0编译运行结果:they are not equal;
在平台CentOS i386上,gcc(GCC)4.4.7 20120313编译后输出结果为they are not equal;
解析:出现not equal这种情况,是因为memcmp_test->data1的类型是short而data2的类型是int,由结构体对齐规则知道memcpy_test的每个成员需要按4字节进行对齐,也就data1和data2之间还有两个字节的空间,其值理论上是随机数,因此test_1变量中的内存空间的每个字节不一定为0值,而test_2调用memset函数后确保了其填充字节已被清零,因为便会得到: they are not equal的结果。通过上面运行的结果,我的猜想是:不同的编译器及其版本,对结构体填充字节的赋值是不同的,不过把填充字节的值看作是随机值来处理总没坏处。
因此,对结构体进行比较的时候,不建议使用字节比较函数如memcmp,如果一定要用,应该确定填充字节被清零,否则结果令你猜不到。
memcmp函数的C语言实现代码:
/*返回值可能为正数,0,负数三种之一,下面实现采用1表示>, 0表示=, -1表示<*/int memcmp(const void *ptr1, const void *ptr2, unsigned int count)
{
const char *p1=(char*)ptr1, *p2=(char*)ptr2;
for( /*NULL*/; 0 < count; count --)
{
if( (*p1 - *p2) < 0)
return -1;
else if( (*p1 - *p2) > 0)
return 1;
(char*)p1 ++;
(char*)p2 ++;
}
return 0;
}
例程:
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int res = memcmp(buffer1, buffer2, 16);
printf("%d\n", res);
输出结果是:1(因为第三个字母g的ASCII比G的要大)
相关函数:
strcmp
函数原型: int strcmp( const char *str1, const char *str2);功能:比较两个字符串的大小,str1>str2返回正数,str1=str2返回0,str1<str2返回-1
strncmp
函数原型:int strncmp( const char *str1, const char *str2, size_t len)功能:比较两个字符串的len个字节,返回值和strcmp一样。
来源:CSDN
作者:fyl_csdn
链接:https://blog.csdn.net/fyl_csdn/article/details/46046229