Head First C学习C标准库的排序函数qsort()

qsort(void *array,//这是个数组指针
        szie_t length,//数组长度,
        size_tiem_size,//数组每个元素的长度
        int(*compar)(const coid *,const void *));
  • qsort()函数通过调用传给它的比较器函数比较聊个元素的大小。
  • (*compar):用来比较数组中两项数据大小的函数指针。
  • const void *:void*指针可以指向任何数据类型。使用前必须把它转化为具体类型。

qsort()函数的使用:

#include 
#include 
#include 

int compare_scores(const void* score_a, const void* score_b)
{
    int a = *(int*)score_a;
    int b = *(int*)score_b;
    return a-b;
}

int compare_scores_desc(const void* score_a, const void* score_b)
{
    return compare_scores(score_b,score_a);
}

int compare_names(const void* a,const void* b)
{
    char** sa = (char**)a;
    char** sb = (char**)b;
    return strcmp(*sa,*sb);
}
int compare_names_desc(const void* a,const void* b)
{
    return compare_names(b,a);
}

int main()
{
    int scores[] = {543,323,32,554,11,3,112};
    int i;
    qsort(scores,7,sizeof(int),compare_scores_desc);
    puts("These are the scores in order:");
    for (int i = 0; i < 7; i++)
    {
        printf("Scores = %i\n",scores[i]);
    }
    char *names[]={"Karen","Mark","Brett","Molly"};
    qsort(names,4,sizeof(char*),compare_names);
    puts("These are the names in order:");
    for (int i = 0; i < 4; i++)
    {
        printf("%s\n",names[i]);
    }
    return 0;

}
  • 字符串数组中的每一项都是字符指针(char*),当qsort()调用比较器函数时,会发送连个指向数组元素的指针,也就是说比较器函数接收到的是指向字符指针的指针,在C语言中就是char**。
  • 当调用strcmp()时,要用strcmp(*a,*b,)而不是strcmp(a,b),是因为a,b的类型是char**,而strcmp()函数需要接受的是char*类型的值。
  • qsort()不会创建新数组,而是在原数组上进行改动。

你可能感兴趣的:(Head First C学习C标准库的排序函数qsort())