memcmp函数的原型为 int memcmp(const void *str1, const void *str2, size_t n));
其功能是把存储区 str1 和存储区 str2 的前 n 个字节进行比较。该函数是按字节比较的,位于string.h。
返回值
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
代码
#include <iostream>
using namespace std;
/*
int memcmp(void *buf1, void *buf2, unsigned int count);
功能:比较内存区域buf1和buf2的前count个字节。
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
*/
int myMemcmp(const void* buffer1,const void* buffer2,size_t count)
{
if(!count)
{
return 0;
}
// 当比较位数不为0时,且每位数据相等时,移动指针
while(count-- && *(char*)buffer1 == *(char*)buffer2)
{
buffer1 = (char*)buffer1 + 1; // 转换类型,移动指针
buffer2 = (char*)buffer2 + 1;
}
// 返回超过比较位数之后 比较的大小
return( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) );
}
void test01()
{
char* str1 = "abcdefg";
char* str2 = "abcdefg";
int res = myMemcmp(str1,str2,4);
cout<<res<<endl;
}
void test02()
{
char* str1 = "abcdefg";
char* str2 = "abadefg";
int res = myMemcmp(str1,str2,2);
cout<<res<<endl;
}
int main(int argc,char* argv[])
{
test01();
test02();
system("pause");
return 0;
}
有看到了另一种写法
https://github.com/gcc-mirror/gcc/blob/master/libiberty/memcmp.c
#include <ansidecl.h>
#include <stddef.h>
int
memcmp (const PTR str1, const PTR str2, size_t count)
{
register const unsigned char *s1 = (const unsigned char*)str1;
register const unsigned char *s2 = (const unsigned char*)str2;
while (count-- > 0)
{
if (*s1++ != *s2++)
return s1[-1] < s2[-1] ? -1 : 1;
}
return 0;
}
其中 PTR 是个宏:
#define PTR char *
这里有访问下标为-1的组数,因为前面s1++了,所以s1此时指向第二个位置,s1[-1]就是第一个位置。只要-1的具体位置在[0,size]范围内,就不会出现非法访问。