如何在 C 中使用 scandir() 来区分大小写?

How to use scandir() in C for case insensitive?

我正在学习 C,我有这个实现来对文件和文件夹进行排序,但这不是不区分大小写的:

#include <dirent.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    struct dirent **namelist;
    int n;

    n = scandir(".", &namelist, NULL, alphasort);
    if (n < 0)
        perror("scandir");
    else {
        printf("Inside else, n = %d\n", n);
        while (n--) {
            printf("%s\n", namelist[n]->d_name);
            free(namelist[n]);
        }
        free(namelist);
    }
}

如果我有 a.txt、b.txt、C.txt 和 z.txt,它将按以下顺序排序:C.txt、a.txt , b.txt, z.txt。我希望它像这样不区分大小写地排序:a.txt、b.txt、C.txt、z.txt

scandir 是用这个原型定义的:

int scandir(const char *restrict dirp,
            struct dirent ***restrict namelist,
            int (*filter)(const struct dirent *),
            int (*compar)(const struct dirent **,
                          const struct dirent **));

函数alphasort按字典顺序对文件名进行排序,因此区分大小写。如果你想要不区分大小写的排序,使用不同的比较函数:

int alphasort_no_case(const struct dirent **a, const struct dirent **b) {
    return strcasecmp((*a)->d_name, (*b)->d_name);
}

scandirstrcasecmp 都是 POSIX 函数:strcasecmp 很可能在支持 scandir 并在 [= 中定义的系统上可用19=].

修改器版本:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int alphasort_no_case(const struct dirent **a, const struct dirent **b) {
    return strcasecmp((*a)->d_name, (*b)->d_name);
}

int main(void) {
    struct dirent **namelist;
    int n;

    n = scandir(".", &namelist, NULL, alphasort_no_case);
    if (n < 0) {
        perror("scandir");
    } else {
        printf("Inside else, n = %d\n", n);
        while (n--) {
            printf("%s\n", namelist[n]->d_name);
            free(namelist[n]);
        }
        free(namelist);
    }
    return 0;
}