【问题标题】:Equality of arrays In cc中数组的相等性
【发布时间】:2015-12-28 04:36:29
【问题描述】:

我必须用整数元素检查两个数组(1-D)的相等性。

我知道没有直接的比较方法。所以我正在做基本的迭代并检查每个元素的相等性。

 for ( int i = 0 ; i < len ; i++) {
    // Equality check

在 C 中测试数组相等性的最有效方法是什么?我可以以某种方式摆脱循环(for ..)吗?

【问题讨论】:

  • 你可以使用memcmp
  • 问题是我在另一个沉重的循环中做它所以它很重。

标签: c arrays


【解决方案1】:

使用memcmp 函数比较两个长度相等的数组。

int a = memcmp(arr1, arr2, sizeof(arr1));
if(!a)
    printf("Arrays are equal\n");
else
    printf("Arrays are not equal\n");

【讨论】:

  • 这仅适用于已知数组具有相同长度的情况。如果arr1arr2 短,那么它会给出误报。
  • 如果arr1arr2 长,它将产生未定义的行为,很可能是以段错误的形式。 -1 。
  • @CareyGregory;我不是说它对等长数组有效吗。
  • 所以你做到了。我忽略了这一点,所以我道歉并撤回我的反对票。
  • 很难想象如果两个数组的长度不同,它们怎么可能相等。
【解决方案2】:

正如其他人所说,使用memcmp() 是有效的。

假设实际数组的一般答案是

int is_equal = sizeof(array1) == sizeof(array2) && !memcmp(array1, array2, sizeof(array1));

如果数组作为指针参数提供给函数,则大小信息会丢失,需要单独提供。

 int IsEqual(void *array1, void *array2, size_t size1, size_t size2)
 {
     return size1 == size2 && !memcmp(array1, array2, size1);
 }

 int main()
 {
      int arr1[] = { /* whatever */ };
      int arr2[] = { /* whatever */ };

      is_equal = IsEqual(arr1, arr2, sizeof(arr1), sizeof(arr2));
      return 0;
 }

或者,在转换为 void 指针之前尽可能晚地保留类型信息(即使用 int 数组的知识),并使用元素数量。

 int IsEqual2(int array1[], int array2[], size_t n1, size_t n2)
 {
      /*  n1 and n2 are number of ints in array1 and array2 respectively */
     return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int));
 }

 int main()
 {
      int arr1[] = { /* whatever */ };
      int arr2[] = { /* whatever */ };

      is_equal = IsEqual2(arr1, arr2, sizeof(arr1)/sizeof(*arr1), sizeof(arr2)/sizeof(*arr2));
      return 0;
 }

【讨论】:

    【解决方案3】:

    你可以referfor循环方法

    否则memcmp 也是一种比较数组的有效方法。 参考memcmp

    int memcmp(const void *s1, const void *s2, size_t n);

    你可以用这个函数比较前n个字节

    int array1[5],array2[5]; 
    int x = memcmp(array1, array2, sizeof(array1));
    

    如果数组大小不同,则:

    • sizeof(array1) 小于 sizeof(array2) ,返回负值。
    • sizeof(array1) 大于 sizeof(array2) ,返回正值。
    • sizeof(array1) 等于 sizeof(array2),它返回零。

      如何使用memcmpAnswer 也在 SO 上。

    记住 memcmp 仅在内存元素或数组大小相等时才有用

    【讨论】:

    • 但是我使用相等性检查作为约束,因此结果必须带有一个确保每个数组元素相等的分配,因此显示的短路技巧对我没有多大用处。谢谢 punit。
    • @user2754673 这里没有“短路技巧”。考虑到您的问题在很大程度上与另一个问题重复,这是一个完全有效的答案。这个答案的唯一缺陷是它受到与黑客答案相同的限制(数组大小是否相等?)。
    • @punitvara 请解释您添加的关于位填充的评论。只要两个数组的类型相同,C 数组就不应该使 memcmp 不可靠。
    • 我希望现在我已经消除了提问者的所有疑虑:-)
    • 注意,像这样使用 sizeof 运算符,array1 必须是数组类型,而不是指针(例如函数参数)。
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2022-03-23
    • 2012-02-09
    • 2012-10-03
    相关资源
    最近更新 更多