【问题标题】:Best way to compare two int arrays of the same length?比较两个相同长度的 int 数组的最佳方法?
【发布时间】:2012-02-25 13:32:19
【问题描述】:

将 int 数组 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 相同的数组。这个问题我google了一段时间,没有找到满意的答案。

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

【问题讨论】:

    标签: c arrays compare int c99


    【解决方案1】:

    使用来自<string.h> 的标准memcmp 函数。

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

    只要ab 相等。

    【讨论】:

    • 次要注意:如果int 类型中有填充位,memcmp() 可能会产生误报。幸运的是,OP 不太可能在这样的实现中运行。
    • @J.C.Salomon:什么是“int 类型中的填充位”?
    • 在这种情况下在 C 中使用 memcmp 并不可靠,因为可能存在填充位。
    • @Useless 的确如此,但这也是一个转移注意力的问题。我说的是整数本身的填充位。
    【解决方案2】:

    使用循环并逐个比较各个元素。

    【讨论】:

    • 当你到达其中一个数组的末尾时不要忘记转义循环,以防大小不同
    【解决方案3】:

    如果你的意思是

    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 */
    

    【讨论】:

    • 在这种情况下在 C 中使用 memcmp 并不可靠,因为可能存在填充位。
    【解决方案4】:

    需要有关该问题的更多信息。 我可以将您的问题分为以下两种方式,

    1. 考虑顺序比较数组内容?? Ex:char a[]={a, b, c}, b[]={a, c, b} 这里考虑的是顺序,内容不一样所以a!=b

    1. 不考虑顺序比较数组内容? 例如: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***
    

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

    这里,我回答了上面的问题 https://stackoverflow.com/a/36130812/5206646

    【讨论】:

      【解决方案5】:

      出于性能原因,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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多