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

4

我该如何使用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指的是数组一中每个元素使用的字节数

2个回答

9
如果您只关心两个数组对象的二进制相等性,那么您甚至不需要循环。
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 没有太大意义(除了相当于美学上的考虑)。


我尝试这个时收到了一个段错误,但我不确定原因。 - Mike Henke
2
@Mike Henke:嗯,我不知道为什么。显然你传递了无效的参数给memcpy,这很容易触发段错误。但我不知道你传递了什么。请展示你的调用代码。 - AnT stands with Russia
我终于想通了!很抱歉回复晚了。谢谢你的帮助!! - Mike Henke

0

由于您的元素可以是任何东西:int8_t、指针、任何类型的双指针;因此,您需要一个特定于存储元素类型的比较函数。

想象一下,您的元素是一个char *:这两个字符串是相同的,但两个地址是不同的。

您需要在比较函数中提供一个指针函数,以便将其传递给您的函数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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接