在C中对结构数组进行排序

use*_*967 3 c sorting

假设我有这样的结构:

typedef struct MyStruct{
  char *string1;
  int number1, number2, number3;
  char string2[11], string3[9];
  char *string4;
  char *string5;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)

程序提示用户选择应该对数据进行排序的字段.我无法想到一种有效排序数组的方法.我真的需要为每个字段编写单独的排序函数吗?必须有其他一些方法,因为编写8个函数,其中2就足够了,看起来不合理.

Jon*_*ler 6

qsort()从中查找<stdlib.h>.它需要一个比较器功能.您可以为不同的排序顺序编写单独的比较器函数,但仍然使用标准库qsort()来进行排序.

例如:

int ms_cmp_string1(const void *vp1, const void *vp2)
{
    const MyStruct *ms1 = vp1;
    const MyStruct *ms2 = vp2;

    int cmp = strcmp(ms1->string1, ms1->string2);
    if (cmp != 0)
        return cmp;
    else if (ms1->number1 < ms2->number1)
        return -1;
    else if (ms1->number1 > ms2->number1)
        return +1;
    //...other comparisons as required...
    else
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于比较器来说,这是一个不错的大纲.这个按此排序string1然后按number1.您可以编写在不同字段上排序的变体,也可以设计一个按您选择的顺序应用各种可能测试的方案.但基本轮廓非常有效,适合传递给qsort()没有任何必要的演员.