如何使用memcmp检查两个数组的相等性?
bool array_is_equal(const void *array_one, void *array_two, const size_t elem_size, const size_t elem_count)
我有这样的事情:
int i;
for(i = 0; i < elem_count; i++){
if(memcmp(array_one, array_two, elem_size) == 0) {
return true;
}
i++;
}
return false;
elem_size是每个数组元素在数组1中使用的字节数
答案 0 :(得分:5)
如果您关心的是两个数组对象的二进制相等,那么您甚至不需要循环
bool array_is_equal(const void *array_one, void *array_two,
const size_t elem_size, const size_t elem_count)
{
return memcmp(array_one, array_two, elem_count * elem_size) == 0;
}
目前尚不清楚为什么数组array_two
突然非const(而数组array_one
为const)。将elem_size
和elem_count
声明为const(除了相当美观的考虑因素)之外没有多大意义。
答案 1 :(得分:0)
因为你的元素可以是任何东西:int8_t,指针,任何东西上的双指针;你需要一个特定于存储元素类型的比较函数。
想象一下你的元素是char *
:2个字符串是相同的,但是2个地址是不同的。
您需要在比较函数上为函数array_is_equal
提供指针函数。
例如:
bool array_is_equal(const void *array_one, void *array_two, const size_t elem_size, const size_t elem_count, bool (*comparison_fn)(void *, void *));
字符串的比较:
bool compare_string(void *str1, void *str2) {
return !!strcmp((char *) str1, (char *)str2);
}
自定义结构的比较: bool compare_mystruct(void * p1,void * p2){ bool ret = true; mystryct * s1 =(mystruct *)p1; mystryct * s2 =(mystruct *)p2;
if(ret) ret = compare_string(p1->str1, p2->str1);
if(ret) ret = compare_string(p1->str2, p2->str2);
if(ret) ret = compare_int(p1->int1, p2->int1);
return ret;
}