c/c++语言开发共享C数组比较

用于比较数组(在C中)以使用来自string.h memcmpstring.h吗?

我想在unit testing中比较整数和双精度数组

我不确定是否使用类似的东西:

 double a[] = {1.0, 2.0, 3.0}; double b[] = {1.0, 2.0, 3.0}; size_t n = 3; if (! memcmp(a, b, n * sizeof(double))) /* arrays equal */ 

或写一个定制的is_array_equal(a, b, n)类型函数?

    memcmp会做一个精确的比较,这对于浮点数来说很少是一个好主意,也不会遵循NaN!= NaN的规则。 对于排序,这很好,但出于其他目的,您可能会进行近似比较,例如:

     bool dbl_array_eq(double const *x, double const *y, size_t n, double eps) { for (size_t i=0; i eps) return false; return true; } 

    在代码中用memcmp替换memset ,它可以工作。

    在您的情况下(因为两个数组数组的大小相同且在编译期间已知)您甚至可以执行以下操作:

     memcmp(a, b, sizeof(a)); 

    使用memcmp通常不是一个好主意。 让我们从更复杂的开始,从那里开始工作。


    虽然你提到了intdouble ,但我首先要把注意力集中在memcmp作为一般解决方案,比如比较类型的数组:

     struct { char c; // 1 int i; // 2 } 

    主要问题是实现可以自由地向位置1和2处的结构添加填充,使得字节比较可能是错误的,即使重要位完全匹配。


    现在下降到双打。 您可能认为这更好,因为那里没有填充。 但是还有其他问题。

    首先是NaN值的处理。 IEEE754不遗余力地确保NaN不等于任何其他值,包括其自身。 例如,代码:

     #include  #include  int main (void) { double d1 = 0.0 / 0.0, d2 = d1; if (d1 == d2) puts ("Okay"); else puts ("Bad"); if (memcmp (&d1, &d2, sizeof(double)) == 0) puts ("Okay"); else puts ("Bad"); return 0; } 

    将输出

     Bad Okay 

    说明差异。

    第二个是正负零的处理。 为了比较的目的,这些应该被认为是相同的,但是,由于位模式不同, memcmp会说它们是不同的。

    将上述代码中的d1d2的声明/初始化更改为:

      double d1 = 0.0, d2 = -d1; 

    会说清楚。


    所以,如果结构和双重问题,肯定整数是可以的。 毕竟,他们总是两个补充,是吗?

    不,实际上他们不是。 ISO强制要求有符号整数的三种编码方案之一,另外两种(补码和符号/幅度)受到类似的问题的影响,即加倍和零均存在的事实。

    因此,尽管它们应该被认为是相等的,但位模式也是不同的。

    即使对于无符号整数,也存在问题(对于有符号值也是一个问题)。 ISO声明这些表示可以具有值位和填充位,并且未指定填充位的值。

    因此,即使对于看起来最简单的情况, memcmp也是一个坏主意。

    你正在寻找的function是memcmp而不是 memset 。 请参阅这个问题的答案,为什么memcmp一系列双打可能不是一个好主意。

    memcmp比较两个内存块的大小

    memset用于初始化缓冲区,其值为给定的大小

    可以在不使用memcmp的情况下比较缓冲区。 对于不同的数据类型,可以更改相同的内容。

     int8_t array_1[] = { 1, 2, 3, 4 } int8_t array_2[] = { 1, 2, 3, 4 } uint8_t i; uint8_t compare_result = 1; for (i = 0; i < (sizeof(array_1)/sizeof(int8_t); i++) { if (array_1[i] != array_2[i]) { compare_result = 0; break; } } 

      以上就是c/c++开发分享C数组比较相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560115.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐