两个长度相同的整型数组如何进行最佳比较?

13

如何最好地将整型数组b和c与a进行比较:

int a[] = {0,1,0,0,1};
int b[] = {0,1,0,0,1};
int c[] = {1,1,0,0,1};

b和c只是示例,假设它们可以是0和1的任意组合。

我正在尝试检测与a相同的数组。我已经搜索了一段时间,但没有找到一个令人满意的答案。

我知道这是初学者问题,感谢您的耐心。

5个回答

32

使用标准的<string.h>库中的memcmp函数。

memcmp(a, b, sizeof(a)) == 0

每当ab相等时。


4
小注:如果int类型中存在填充位,memcmp()可能会产生错误的负面结果。幸运的是,提问者不太可能遇到这样的实现。 - J. C. Salomon
在这种情况下,在C语言中使用memcmp是不可靠的,因为可能存在填充位。 - this
当然,数组之间可能没有填充。 - Useless
1
@Useless 这是正确的,但这也是一个红鲱鱼。我在谈论整数本身中的填充位。 - this
你认为在 int 内部存在秘密未初始化的位吗?也许你可以给出一个实际的例子来说明你的意思 - 实际上,最好是提出一个问题(如果你愿意,还可以回答)而不是在评论中继续讨论。 - Useless
显示剩余2条评论

5
如果您的意思是:
int a[] = {0,1,0,0,1};
int b[] = {0,1,0,0,1};
int c[] = {1,1,0,0,1};

那么

memcmp(a, b, sizeof(a)); /* returns zero for a match */
memcmp(a, c, sizeof(a)); /* returns nonzero for no match */

4
在这种情况下在C语言中使用memcmp是不可靠的,因为可能存在填充位。 - this

4
使用循环逐个比较每个元素。

当您到达其中一个数组的末尾时,请不要忘记退出循环,以防大小不同。 - Wim

0

需要更多关于这个问题的信息。 我可以将您的问题分为以下两种方式:

  1. 考虑顺序比较数组内容?? 例如:char a[]={a, b, c}, b[]={a, c, b},由于您考虑了顺序,所以内容不同,因此 a!=b

比较无序数组的内容? 例如:char a[]={a, b, c}, b[]={a, c, b}。 如果您不考虑顺序,则这两个数组的内容相同,即a==b。

问题1的解决方案: 可以使用 memcmp 来解决这个问题。因为 memcmp 将按字典顺序进行比较,并返回以下值之一:0、1 或 -1。

 #include<stdio.h>
    #include<string.h>
    int main()
    {

        char a[]={'a','b','c'};
        char b[]={'a','b','c'};
        int x=memcmp(a,b,sizeof(a));
        printf("%d\n",x);

    return 0;
    }
***output:0***

    #include<stdio.h>
    #include<string.h>
    int main()
    {

        char a[]={'a','c','b'};
        char b[]={'a','b','c'};
        int x=memcmp(a,b,sizeof(a));
        printf("%d\n",x);

    return 0;
    }
***output:1***

    #include<stdio.h>
    #include<string.h>
    int main()
    {

        char a[]={'a','b','c'};
        char b[]={'b','a','c'};
        int x=memcmp(a,b,sizeof(a));
        printf("%d\n",x);

    return 0;
    }
***output:-1***

第二题的解决方案: 可以使用memcmp来解决这个问题,以下是最佳解决方案

在这里,我回答了上述问题 https://dev59.com/zmAf5IYBdhLWcg3w52Ll#36130812


0

出于性能原因,memcmp()将逐字节比较,而int数组则以4字节块为单位。如果数组很大或者你需要比较许多数组,这很可能会非常慢。

最简单的方法是运行一个for循环,一旦找到差异就退出。

bool is_array_equal(const int * a, const int * b, length){
    for (int i = 0; i < length; ++i){
        if(a[i] != b[i]){ return false; }
    }
    return true;
}

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