C数组memcmp麻烦

时间:2018-04-27 07:01:27

标签: c arrays

我需要为我的UNI编写代码,其中我必须接收2个数组的数组(可能是int数组或char数组,甚至是float数组),并比较两个数组中指针的n个字符,到目前为止,我一直坚持这一点 *请注意 - 我需要编写自己的memcmp

int byte_compare(const void *b1,const void *b2,size_t len)
{
    char *q1 = (char *)p1;
    char *q2 = (char *)p2;
    int i;

    for (i=0; i<=len*sizeof(*q1) ;i++)
    {
      if(*q1++ != *q2++)
           return 1;
    }
    return 0;
}   

int main()
{
          char str1[] = "abcheya";
          char str2[] = "gtyheyb";

          printf((byte_compare(str1[3],str2[3],3))?"not equal\n":"equal\n");
          /*the output is equal*/

          int arr1[]={1,2,3,4};
          int arr2[]={1,2,7,59};

          printf((byte_compare(arr1[0],arr2[0],3))?"not equal\n":"equal\n");
          /*the output is also equal although it is not supposed to be*/

          return 0;
}

当我比较字符串时它工作正常,但是当我尝试比较int或float时它不能正常工作,请帮助我。

4 个答案:

答案 0 :(得分:1)

您应该在传递len参数时计算比较字节长度。因此,您可以使用模板。

template<typename T>
int byte_compare(const T *b1, const T *b2, size_t len)
{
    return memcmp(b1, b2, len * sizeof(T));  
}

编辑注释:问题已编辑,答案没有更多意义。它使用C ++,不适用于C课程。我仍然没有使用C ++的限制。

答案 1 :(得分:0)

编辑:编写自己的memcmp函数

int byte_compare(const void *b1,const void *b2,size_t len)
{
    if (len != 0) {
        register const unsigned char *p1 = b1, *p2 = b2;

        do {
            if (*p1++ != *p2++)
                return (*--p1 - *--p2);
        } while (--len != 0);
    }
    return (0);
}

答案 2 :(得分:0)

你需要传递对象的 size ,而不是它们的长度:

int byte_compare(const void *b1, const void *b2, size_t size)
{    
   return memcmp(b1, b2, size);
}

答案 3 :(得分:0)

您的教师可能不希望您使用库调用。所以写一个字节比较(也就是memcmp)。

获取K&amp; R C(或C上的其他书籍)的副本,您将找到如何在循环中处理char(acter)值的示例。

int byte_compare(const void *b1,const void *b2,size_t len)
{
    if( !b1 || !b2 ) return 0; //0 represents false
    char* p1=(char*)b1; char* p2=(char*)p2;
    for( ; len --> 0; ) {
        if( *p1++ != *p2++ ) return 0;
    }
    return 1;
}