qsort - сортировка массива
qsort(3)
сортировка массива
Other Alias
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);
}