C/400

58. C400 におけるソートのテクニック(2)

C言語において SORT と言えば代表的であるのが qsort による SORT である。
しかし実用の面において文字列の SORT を行いたい場合でも
ほとんどの qsort のサンプルは main 関数からの文字列の入力であり、
しかも 1文字ずつを SORT するというものである。
これでは実際の記述においてほとんど役には立たない。
そこで一般的に通じるような qsort の使い方のサンプルをここで紹介する。

0001.00 #include <stdio.h>                                 
0002.00 #include <stdlib.h>                                
0003.00 #include <string.h>                                
0004.00                                                    
0005.00 #define TRUE         0                             
0006.00 #define FALSE       -1                             
0007.00                                                    
0008.00 int compare(const void *arg1, const void *arg2);   
0009.00 void main(void){                                   
0010.00   int i;                                           
0011.00   char ary[3][4], name[5];                         
0012.00                                                    
0013.00   printf("** TESTSORT **\n");                      
0014.00   getchar();                                       
0015.00   memset(ary, 0, sizeof(ary));                     
0016.00   strcpy(ary[0], "A002");                          
0017.00   strcpy(ary[1], "A003");                          
0018.00   strcpy(ary[2], "A001");                          
0019.00   qsort((char*)ary, 3, 4, compare);                
0020.00   for(i = 0; i<3; i++){                            
0021.00     memcpy(name, ary[i], 4);                       
0022.00     name[4] = 0x00;                                
0023.00     printf("ary[%d] = %s\n", i, name);             
0024.00   }                                             
0025.00   getchar();                                    
0026.00 }                                               
0027.00                                                 
0028.00 int compare(const void *arg1, const void *arg2) 
0029.00 {                                               
0030.00   return (strcmp((char*)arg1, (char*)arg2));    
0031.00 }                                               
【 解説 】

一般的な他のサンプル事例に比べて compare 関数の型が異なっているはずである。
qsort であれば

qsort((char*)ary, 3, 4, compare);

のわずか一行だけで SORT を行うことができる。
3項目の4バイトの文字列を SORT している。
なお qsort を使う場合の文字列の配列は

char ary[3][4]

のように NULL の分は考慮に入れずに 4バイトの文字列を SORT するのであれば 配列も
4バイト長で定義しておくことが必要である。
これは qsort が文字列全体をひとつして SORT するからである。
また qsort は、比較関数をユーザー定義しなければならないのは一見、不便なように
思えるが逆に言えば、どのような順序に並び替えるにしてもユーザーで設定することが
できるというのは柔軟で汎用的な機能を提供していることになる。