Man page - qsort(3)

Packages contains this manual

Available languages:

en fr es pl ja ru ro de

Manual

QSORT

名 前
書 式
説 明
返 り 値
バ ー ジ ョ ン
属 性
準 拠
注 意

関 連 項 目
こ の 文 書 に つ い て

名 前

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 で 追 加 さ れ た 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-36850-1.png

準 拠

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)
{
/* こ の 関 数 の 実 際 の 引 数 は "char 型 へ の ポ イ ン タ ー の ポ イ ン タ ー " だ が 、
strcmp(3) の 引 数 は "char 型 へ の ポ イ ン タ ー " で あ る 。
そ こ で 、 以 下 の よ う に キ ャ ス ト を し て か ら ポ イ ン タ ー の 逆 参 照 を 行 う 。 */

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

int
main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stderr, "Usage: %s <string>...\n", argv[0]);
exit(EXIT_FAILURE);
}

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

for (int j = 1; j < argc; j++)
puts(argv[j]);
exit(EXIT_SUCCESS);
}

関 連 項 目

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

こ の 文 書 に つ い て

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