【问题标题】:C code for using qsort() to sort in the order the user wants using function pointers使用 qsort() 使用函数指针按用户想要的顺序排序的 C 代码
【发布时间】:2017-02-18 10:10:02
【问题描述】:

我正在创建一个 C 代码以使用 qsort() 进行排序。我需要从用户那里获取一个数组,然后我需要从用户那里获取一个以升序打印这个数组,如果我想以降序打印它,则需要 d。问题是我需要使用函数指针来执行此操作。我尝试使用函数指针数组,但问题是用户需要输入两个字符。

#include <stdio.h>
#include <stdlib.h>


int  a( const void *va , const void * vb )
 {
    const int * a = ( const int *) va ;
    const int * b = ( const int *) vb ;
    if (* a < *b ) return -1;
    else if (* a > * b) return 1;
    else return 0;
 }

 int  d( const void *va , const void * vb )
 {
    const int * a = ( const int *) va ;
    const int * b = ( const int *) vb ;
    if (* a < *b ) return 1;
    else if (* a > * b) return -1;
    else return 0;
 }


int main()
{
    int *arr;
    int n, i;
    char c;

    scanf("%d", &n);

    arr=(int*)malloc(sizeof(int)*n);

    for(i=0;i<n;i++)
    {
        scanf("%d", &arr[i]);
    }

    while(1)
    {
        scanf("%c", &c);
        getchar();
        if(c=='e')
            break;


        qsort ( arr , n , sizeof(arr[0]) , d);
    }

    for(i=0;i<n;i++)
    {
    printf("%d", arr[i]);
    }
    return 0;
}

【问题讨论】:

  • 网上有很多解决方法,搜索一下
  • 注意:a() 的常用习语 --> return (* a &gt; * b) - (* a &lt; * b);
  • C 不需要所有这些演员表。此外,它们可能会隐藏错误。只需删除它们。
  • 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。
  • 堆分配函数(malloc、calloc、realloc)1)都有一个返回类型void *,可以分配给任何其他指针。所以不需要转换返回值。强制转换只会使代码混乱,使其更难以理解、调试和维护。 2) 始终检查 (!=NULL) 返回值以确保操作成功。

标签: c arrays sorting function-pointers qsort


【解决方案1】:

因此,声明一个指向函数的变量comparison_func,并在if 语句中设置它:

int (*comparison_func)(const void *, const void *);

if (c == 'a') {
    comparison_func = a;
}
else if (c == 'c') {
    comparison_func = d;
}

然后在调用 qsort 时使用这个comparison_func

qsort(arr, n, sizeof(arr[0]), comparison_func);

或者你可以声明一个struct,它有选项字符和相应的指针:

typedef struct sortfunc {
    char option;
    int (*comparison_func)(const void *, const void *);
} SORTFUNC;

SORTFUNC sort_funcs[] = {
    {'a', a},
    {'d', d},
    {0,   0}
};

然后通过这个数组找到匹配的选项字符:

SORTFUNC *i;
for (i = sort_funcs; i->option && i->option != c; i++);
if (! i->comparison_func) {
    printf("choice %c is invalid\n", c);
}
else {
    qsort(..., i->comparison_func);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多