qsort, qsort_r - sortuje tablicę
Standardowa biblioteka C (
libc,
-lc)
#include <stdlib.h>
void qsort(void base[.size * .nmemb], size_t nmemb, size_t size,
int (*compar)(const void [.size], const void [.size]));
void qsort_r(void base[.size * .nmemb], size_t nmemb, size_t size,
int (*compar)(const void [.size], const void [.size], void *),
void *arg);
qsort_r():
_GNU_SOURCE
Funkcja
qsort() sortuje tablicę
nmemb elementów o
rozmiarze
size. Argument
base wskazuje na początek
tablicy.
Zawartość tablicy jest sortowana w porządku
rosnącym, zgodnie z funkcją porównawczą,
określoną przez wskaźnik
compar. Funkcja ta jest
wołana z dwoma argumentami, które wskazują na
porównywane obiekty.
Funkcja porównująca musi zwracać liczbę
całkowitą, która jest mniejsza, równa, lub
większa od zera. Oznacza to wtedy, odpowiednio, że pierwszy
argument jest mniejszy, równy, lub większy od drugiego.
Jeśli oba porównywane elementy są jednakowe, to ich
kolejność w posortowanej tablicy jest nieokreślona.
Funkcja
qsort_r() jest taka sama jak
qsort(), z wyjątkiem
tego, że funkcja porównująca
compar przyjmuje
trzeci argument. Wskaźnik podany w argumencie
arg jest
przekazywany do funkcji porównującej. W ten sposób
funkcja porównująca nie potrzebuje zmiennych globalnych, by
przekazywać sobie dowolne argumenty i dlatego jest bezpieczna do
używana w aplikacji wielowątkowej.
Funkcje
qsort() i
qsort_r() nic nie zwracają.
qsort_r() was added in glibc 2.8.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
qsort(), qsort_r() |
Bezpieczeństwo wątkowe |
MT-Safe |
qsort(): POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Aby porównać łańcuch znaków w stylu C,
funkcja porównująca może wywołać
strcmp(3), tak jak to pokazano w przykładzie poniżej.
Jeden przykład użycia można znaleźć w
podręczniku
bsearch(3).
Kolejnym przykładem jest następujący program,
sortujący łańcuchy znaków podane w argumentach
linii poleceń:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
cmpstringp(const void *p1, const void *p2)
{
/* Argumentami tej funkcji są "wskaźniki do wskaźników
na znak", ale argumentami strcmp(3) są "wskaźniki na
znak", dlatego potrzebne jest rzutowanie i dereferencja. */
return strcmp(*(const char **) p1, *(const char **) p2);
}
int
main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stderr, "Użycie: %s <string>...\n", argv[0]);
exit(EXIT_FAILURE);
}
qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);
for (size_t j = 1; j < argc; j++)
puts(argv[j]);
exit(EXIT_SUCCESS);
}
sort(1),
alphasort(3),
strcmp(3),
versionsort(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Przemek Borys <
[email protected]>, Andrzej Krzysztofowicz
<
[email protected]>, Robert Luberda <
[email protected]> i
Michał Kułach <
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]