Manpages

名 前

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 を ポ イ ン タ ー と す る 比 較 関 数 に よ っ て 、 配 列 の 中 身 は 昇 順 (値 の 大 き い も の ほ ど 後 に 並 ぶ 順 番 ) に 並 べ ら れ る 。 比 較 関 数 の 引 き 数 は 比 較 さ れ る ふ た つ の オ ブ ジ ェ ク ト の ポ イ ン タ ー で あ る 。 比 較 関 数 は 、 第 一 引 き 数 が 第 二 引 き 数 に 対 し て 、 1) 小 さ い 、 2) 等 し い 、 3) 大 き い の そ れ ぞ れ に 応 じ て 、 1) ゼ ロ よ り 小 さ い 整 数 、 2) ゼ ロ 、 3) ゼ ロ よ り 大 き い 整 数 の い ず れ か を 返 さ な け れ ば な ら な い 。 二 つ の 要 素 の 比 較 結 果 が 等 し い と き 、 並 べ 変 え た 後 の 配 列 で は 、 こ れ ら 二 つ の 順 序 は 規 定 さ れ て い な い 。

qsort_r() 関 数 は qsort() と 同 じ だ が 、 比 較 関 数 compar が 第 3 引 き 数 を 取 る 点 が 異 な る 。 ポ イ ン タ ー が arg 経 由 で 比 較 関 数 に 渡 さ れ る 。 こ れ に よ り 、 比 較 関 数 は 任 意 の 引 き 数 を 渡 す た め に グ ロ ー バ ル 変 数 を 使 う 必 要 が な く な り 、 そ の た め 、 リ エ ン ト ラ ン ト (再 入 可 能 ) で 安 全 に ス レ ッ ド で 使 用 で き る よ う に な る 。

返 り 値

関 数 qsort() と qsort_r() は 値 を 返 さ な い 。

バ ー ジ ョ ン

qsort_r() は glibc バ ー ジ ョ ン 2.8 で 追 加 さ れ た 。

準 拠

qsort() 関 数 は SVr4, 4.3BSD, C89, C99 に 準 拠 し て い る 。

注 意

qsort() の compar 引 き 数 に 使 用 す る の に 適 し て い る ラ イ ブ ラ リ ル ー チ ン と し て は alphasort(3), versionsort(3) が あ る 。 C の 文 字 列 を 比 較 す る 場 合 、 以 下 の 例 に あ る よ う に 比 較 関 数 で strcmp(3) を 呼 び 出 す こ と も で き る 。

使 用 例 に つ い て は 、 bsearch(3) に あ る 例 を 参 照 す る こ と 。 以 下 の プ ロ グ ラ ム に 別 の 使 用 例 を 示 す 。 こ の プ ロ グ ラ ム は 、 コ マ ン ド ラ イ ン 引 き 数 で 指 定 さ れ た 文 字 列 の 並 び 換 え を 行 う 。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int
cmpstringp(const void *p1, const void *p2)
{
/* こ の 関 数 の 実 際 の 引 き 数 は "char 型 へ の ポ イ ン タ ー の ポ イ ン タ ー " だ が 、
strcmp(3) の 引 き 数 は "char 型 へ の ポ イ ン タ ー " で あ る 。 そ こ で 、 以 下 の よ う に キ ャ ス ト を し て か ら ポ イ ン タ ー の 逆 参 照 を 行 う 。
*/

return strcmp(* (char * const *) p1, * (char * const *) p2); }

int
main(int argc, char *argv[])
{
int j;

if (argc < 2) {
fprintf(stderr, "Usage: %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)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。