C言語,qsort()関数で文字列を昇順や降順にソートする

スポンサーリンク

鍛錬 735

C言語,qsort()関数で文字列を昇順や降順にソートする

文字列が複数格納されている配列を昇順や降順にソートする(並び替える)手段として、qsort()関数を使用する方法があります。

関連記事:C言語,qsort()関数で数値を昇順や降順にソートする
 
以下は、qsort()関数についてです。

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
 

引数

以下は、上記の引数についてです。

引数 意味
void *base ソートする配列の先頭へのポインタ
size_t nmemb 配列の要素数
size_t size 要素の大きさ
int (*compar)(const void *, const void *) 比較関数

戻り値

qsort()関数の戻り値はありません。

比較関数は、以下のルールで戻り値を返す必要があります。

戻り値
int 第1引数 < 第2引数 負の整数
int 第1引数と第2引数が等しい 0
int 第1引数 > 第2引数 正の整数
スポンサーリンク

プログラム

以下は、文字列の配列を昇順と降順にソートするプログラム、qsort_str.c です。

今回は、次の文字列をソートしています。

配列の
要素番号
ソート前の文字列
0 BBB
1 333
2 AAA
3 DDD
4 222
5 CCC
6 444
7 111
// include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// prototype
int SortAscendStr(const void *str1, const void *str2);
int SortDescendStr(const void *str1, const void *str2);

// main
int main(void)
{
	char *str[8];
	unsigned int elmt;
	size_t cnt;
	
	// ソート対象の文字列を格納
	str[0] = "BBB";
	str[1] = "333";
	str[2] = "AAA";
	str[3] = "DDD";
	str[4] = "222";
	str[5] = "CCC";
	str[6] = "444";
	str[7] = "111";
	
	// ソート対象の要素数を格納
	cnt = 8;
	
	printf("ソート前\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%s] ", str[elmt]);
	}
	printf("\n");
	printf("\n");
	
	// 文字列を昇順でソート
	qsort(str, cnt, sizeof(*str), SortAscendStr);
	printf("昇順でソート\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%s] ", str[elmt]);
	}
	printf("\n");
	printf("\n");
	
	// 文字列を降順でソート
	qsort(str, cnt, sizeof(*str), SortDescendStr);
	printf("降順でソート\n");
	for (elmt = 0; elmt < cnt; elmt++) {
		printf("[%s] ", str[elmt]);
	}
	printf("\n");
	
	return 0;
}

// =======================================
// @brief  文字列を昇順でソートする
// @param  str1 [in],比較対象1
// @param  str2 [in],比較対象2
// @return 負 比較対象1の方が小さい
// @return 0  比較対象1と比較対象2が等しい
// @return 正 比較対象1の方が大きい
// @note   無し
// =======================================
int SortAscendStr(const void *str1, const void *str2)
{
	return strcmp(*(char **)str1, *(char **)str2);
}

// =======================================
// @brief  文字列を降順でソートする
// @param  str1 [in],比較対象1
// @param  str2 [in],比較対象2
// @return 負 比較対象2の方が小さい
// @return 0  比較対象1と比較対象2が等しい
// @return 正 比較対象2の方が大きい
// @note   無し
// =======================================
int SortDescendStr(const void *str1, const void *str2)
{
	return strcmp(*(char **)str2, *(char **)str1);
}
スポンサーリンク

実行結果

以下は、プログラム qsort_str.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra qsort_str.c -o qsort_str
***@ubuntu:~/***/test/c$ ./qsort_str
ソート前
[BBB] [333] [AAA] [DDD] [222] [CCC] [444] [111] 

昇順でソート
[111] [222] [333] [444] [AAA] [BBB] [CCC] [DDD] 

降順でソート
[DDD] [CCC] [BBB] [AAA] [444] [333] [222] [111]

 
上記に示した通り、文字列を昇順と降順にソートすることができました。

配列の
要素番号
ソート前 ソート結果
(昇順)
ソート結果
(降順)
0 BBB 111 DDD
1 333 222 CCC
2 AAA 333 BBB
3 DDD 444 AAA
4 222 AAA 444
5 CCC BBB 333
6 444 CCC 222
7 111 DDD 111
タイトルとURLをコピーしました