检查两个数组是否相等 - C

时间:2016-01-28 00:05:41

标签: c arrays

如何使用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中使用的字节数

2 个答案:

答案 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_sizeelem_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;
}