名 前
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/ に 書 か れ て い る 。