当前位置:  开发笔记 > 人工智能 > 正文

在C中用整数和字符(字符串)数组中的最小元素编写泛型函数

如何解决《在C中用整数和字符(字符串)数组中的最小元素编写泛型函数》经验,为你挑选了1个好方法。

我试图编写一个泛型函数来获取整数或字符串数​​组中的最小元素.我正在使用记忆功能.以下是我写的代码:

编辑:修改过的代码 - 我从int size_t改变了int size

/* Write a function that returns minimum values of an array of integers or strings */
#include 
#include 
#include 

void returnMinAddress(void *a, void *b, int arr_size, int size) {
  b = a;
  for (int i = 0; i < arr_size; i++) {
    if (memcmp(b, a+((i)*size), size) < 0) {
      memmove(b, a+((i)*size), size);
    }
  }
}
int main() {
  void *b = malloc(sizeof(int));
  /* For an array of type integer */
  int a[8] = {3, 2, 1, -4, 6, 9, 8, -1};
  returnMinAddress(a, b, 8, sizeof(int));
  printf("The result is : %d\n", *(int *)b);
  free(b);
  return 0;
}

花了很多时间后,我不明白为什么我一直把答案都改为0 ..以下是输出的截图.我在这里错过了什么?

原始代码:

#include 
#include 
#include 

void returnMinAddress(void *a, void *b, int arr_size, int size_t) {
  b = a;
  for (int i = 0; i < arr_size; i++) {
    if (memcmp(b, a+((i)*size_t), size_t) < 0) {
      memmove(b, a+((i)*size_t), size_t);
    }
  }
}
int main() {
  void *b = malloc(sizeof(int));
  /* For an array of type integer */
  int a[8] = {3, 2, 1, -4, 6, 9, 8, -1};
  returnMinAddress(a, b, 8, sizeof(int));
  printf("The result is : %d\n", *(int *)b);
  free(b);
  return 0;
}

产量



1> Vlad from Mo..:

您的通用功能无效.

首先,虽然size_t它不是关键字,但它是一个类型说明符.因此,将此单词用作标识符是一个坏主意.

这个说法

b = a;

应该换成

memmove( b, a, size_t );

其次根据C标准,您可能不会将指针算法应用于类型的指针,void *因为类型void是不完整的类型.所以你应该写一些例子

( char * )a + i * size_t 

代替

a+((i)*size_t) 

当函数搜索最小值然后在此语句中的条件

if (memcmp(b, a+((i)*size_t), size_t) < 0) {

应该写得像

if ( memcmp( ( char * )a + i * size_t, b, size_t ) < 0) 

考虑到所有这些,功能可能看起来像

void returnMinAddress( void *a, void *b, size_t n, size_t m) 
{
    memmove(b, a, m);

    for (size_t i = 1; i < n; i++) 
    {
        if ( memcmp( ( char * )a + i * m, b, m ) < 0 ) 
        {
            memmove(b, ( char * )a + i * m, m );
        }
    }
}

但是还有一个问题是函数无法解决.被认为是原始字节序列的负整数可能大于正数.因此,如果您将尝试上面显示的数组函数

int a[8] = { 3, 2, 1, -4, 6, 9, 8, -1 };

你会得到最小值等于1 而物流等于-4.

编写这种通用函数的方法之一如下

#include 

void * returnMinAddress( const void *a, size_t n, size_t m, int cmp( const void *, const void *) ) 
{
    const void *min = a;

    for (size_t i = 1; i < n; i++) 
    {
        if ( cmp( ( const char * )a + i * m, min ) < 0 ) 
        {
            min = (const char *)a + i * m;
        }
    }

    return (void *)min;
}

int cmp_int(const void *p1, const void *p2)
{
    int a = *(const int *)p1;
    int b = *(const int *)p2;

    return (b < a) - (a < b);
}

int main( void )
{
    int a[8] = { 3, 2, 1, -4, 6, 9, 8, -1 };

    int *b = returnMinAddress(a, 8, sizeof(int), cmp_int);
    printf("The result is : %d\n", *b);
}

程序输出是

The result is : -4

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有