使用 qsort() 使用函数指针按照用户想要的顺序进行排序的 C 代码

标签 c arrays sorting function-pointers qsort

我正在创建一个 C 代码来使用 qsort() 进行排序。我需要从用户那里获取一个数组,之后我需要从用户那里获取 a 以升序打印该数组,如果我想以降序打印它则需要 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;
}

最佳答案

因此,声明一个函数指针变量 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);
}

关于使用 qsort() 使用函数指针按照用户想要的顺序进行排序的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42313784/

相关文章:

javascript - 按小数点排序数组然后按字符串排序 - Javascript

c - 那里有软件缓存 API 吗?

c - 交换 char 指针的值

php - 在水平 HTML 表格中插入 foreach 输出

arrays - Fortran 2008 : How are function return values returned?

链表可以通过改变引用来排序吗?

c - C 中的后递增运算符

c - C中的傅里叶变换

arrays - 如何将非原始对象数组写入 Arduino EEPROM,然后在每次程序启动时将该数组读入内存

java - 如何按降序对包含字符串的 arrayList 进行排序