当前位置: C语言 -- 附录 -- qsort_s

qsort_s函数


概要:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdlib.h>
errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
      int (*compar)(const void *x, const void *y, void *context),
      void *context);

描述:

该函数对数组进行排序。参数base指向排序数组的初始元素,参数nmemb指定数组的元素数目,参数size指定以字节形式表示的单个数组元素的大小,参数compar指向比较函数。

数组元素按参数compar指向的比较函数升序排序。参数compar指向的比较函数存在三个参数:前两个参数指向比较的对象;第三个参数是qsort_s函数的参数context。如果第一个参数指向的对象大于、小于或者等于第二个参数指向的对象,比较函数将返回一个大于、小于或者等于0的整数。

参数context对于qsort_s函数的唯一用处是传递给比较函数用作第三个参数;比较函数执行时,该参数提供附加信息,例如:指定比较函数使用的排序序列(collating sequence)。

如果两个元素相等,它们在结果排序数组中的相对顺序ISO/IEC 9899:2018标准未作明确说明。


运行约束:

参数nmemb和参数size应不大于宏RSIZE_MAX。如果参数nmemb不等于0,参数base和参数compar不能是空指针。

如果存在运行约束冲突,qsort_s函数不会对数组进行排序。


参数:
void *base

指向排序数组初始元素的指针。

rsize_t rnmemb

数组的元素数目。

rsize_t rsize

以字节形式表示的单个数组元素的大小。

int (*compar)(const void *x, const void *y, void *context)

指向比较函数的指针。比较函数会被qsort_s函数反复调用,用于比较数组元素。

根据函数的返回值是大于、小于还是等于0,对数组元素进行排序,具体规则如下:

返回值 含义
大于0 指针x指向的元素将排在指针y指向的元素之后。
小于0 指针x指向的元素将排在指针y指向的元素之前。
等于0 指针x指向的元素与指针y指向的元素相等。

比较函数compar中的context参数与qsort_s函数中的context参数是相同的。

void *context

传递给比较函数用作第三个参数,比较函数执行时使用,例如:指定比较函数使用的排序序列(collating sequence)。


返回值:

如果不存在运行约束冲突,函数返回0;否则函数返回非0值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
/*安全函数qsort_s范例*/

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5

int funcCompare(void *context, const void *x, const void *y)
{
    return (*(int *)x-*(int *)y);
}

int main(void)
{
    int number[LENGTH] = {10, -5, 0, 25, 3};

    qsort_s(number, LENGTH, sizeof(int), funcCompare, NULL);
    for(int i=0; i<LENGTH; ++i)
    {
        printf_s("%d ", number[i]);
    }

    return 0;
}


输出:

-5 0 3 10 25

注:使用Visual Studio编译。


qsort_s函数在Visual Studio中的声明与ISO/IEC 9899:2018标准有差异,在Visual Studio中声明如下:

void qsort_s(
   void *base, 
   size_t num,
   size_t width,
   int (__cdecl *compare)(void *, const void *, const void *),
   void *context);

base: 指向排序数组初始元素的指针。

num: 数组的元素数目。

width: 每个元素的字节数。

compare: 指向比较函数的指针。

context: 指向上下文的指针,可以是比较过程中需要访问的任何对象。

ISO/IEC 9899:2018标准中,比较函数比较的是前两个参数的大小;在Visual Studio中,比较函数比较的是后两个参数的大小。


相关内容:
qsort 对数组元素进行排序的函数。
bsearch_s 搜索匹配数组元素的安全函数。