QSORT(3) Руководство программиста Linux QSORT(3)

ИМЯ

qsort, qsort_r - сортировка массива

ОБЗОР

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));
void qsort_r(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *, void *),
           void *arg);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

qsort_r(): _GNU_SOURCE

ОПИСАНИЕ

Функция qsort() сортирует массив из nmemb размером size. Аргумент base указывает на начало массива.

Содержимое массива сортируется в соответствии с функцией сравнения, на которую ссылается compar, вызываемой вместе с двумя аргументами, которые ссылаются на сравниваемые объекты.

Функция сравнения должна вернуть целое, меньшее, равное и большее нуля для случаев, когда первый аргумент меньше, равен или больше второго соответственно. Если оба элемента сравнения равны, порядок их сортировки в массиве не будет определен.

Функция qsort_r() идентична qsort(), за исключением того, что в функцию сравнения compar добавлен третий аргумент. Указатель передаётся в функцию сравнения через аргумент arg. Таким образом, функции сравнения не требуется глобальные переменные для передачи произвольных аргументов, и поэтому она реентерабельна и её можно безопасно использовать в нитях.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функции qsort() и qsort_r() ничего не возвращают.

ВЕРСИИ

Функция qsort_r() впервые появилась в glibc 2.8.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
qsort(), qsort_r() Безвредность в нитях MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ

qsort(): POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

ЗАМЕЧАНИЯ

Для сравнения C-строк в качестве функции сравнения можно использовать strcmp(3), как это указано ниже.

ПРИМЕР

Для примера использования смотрите пример, указанный в bsearch(3).

Еще один пример программы, сортирующей строки, переданные в качестве аргументов через командную строку:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
cmpstringp(const void *p1, const void *p2)
{

    /* Аргументами данной функции являются "pointers to

       pointers to char", однако аргументами strcmp(3)

       являются "pointers to char", так что здесь происходит

       преобразование и разыменовывание ссылок */

    return strcmp(* (char * const *) p1, * (char * const *) p2);
}
int
main(int argc, char *argv[])
{

    int j;

    if (argc < 2) {

        fprintf(stderr, "Использование: %s <string>...\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);

    for (j = 1; j < argc; j++)

        puts(argv[j]);

    exit(EXIT_SUCCESS);
}

СМОТРИТЕ ТАКЖЕ

sort(1), alphasort(3), strcmp(3), versionsort(3)

2019-03-06