MW211 EXIT

devlog
C言語/qsort()NULLあり文字列配列の場合
2013年04月01日
「strcmp()」は比較対象にNULLが入ると例外となってしまう。
一部の処理系では、比較対象の両方ともがNULLなら同一(戻り値0)とみなす場合あり

ということで、文字列の比較の場合はNULLの考慮が必要だ。

NULLが混じった文字列配列を並び替える場合。
┌──────────────────────────────────────┐
│char*  配列[] = {"ccc","aaa","eee",NULL,"ddd"};  // サンプルデータ          │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にして、NULLを先頭とする場合  → NULL,"aaa","ccc","ddd","eee"        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return -1;}                            │
│    if (*(const char**)b == NULL)   {return  1;}                            │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 昇順にして、NULLを末尾とする場合  → "aaa","ccc","ddd","eee",NULL        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return  1;}                            │
│    if (*(const char**)b == NULL)   {return -1;}                            │
│    return strcmp(*(const char**)a, *(const char**)b);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にして、NULLを先頭とする場合  → NULL,"eee","ddd","ccc","aaa"        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return -1;}                            │
│    if (*(const char**)b == NULL)   {return  1;}                            │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にして、NULLを末尾とする場合  → "eee","ddd","ccc","aaa",NULL        │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    if ((*(const char**)a == NULL)                                          │
│     && (*(const char**)b == NULL)) {return  0;}                            │
│    if (*(const char**)a == NULL)   {return  1;}                            │
│    if (*(const char**)b == NULL)   {return -1;}                            │
│    return strcmp(*(const char**)b, *(const char**)a);                      │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++