提问人:elvis 提问时间:12/31/2021 最后编辑:chqrlieelvis 更新时间:12/31/2021 访问量:558
如何在 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);
}
}
如果我有 .txt、b.txt、C.txt 和 z.txt,它将按以下顺序排序:C.txt、a.txt、b.txt、z.txt。我希望像这样对大小写进行排序:a.txt、b.txt、C.txt、z.txt
答:
3赞
chqrlie
12/31/2021
#1
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);
}
和 都是 POSIX 函数:极有可能在支持 和 中定义的系统上可用。scandir
strcasecmp
strcasecmp
scandir
<strings.h>
修改器版本:
#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;
}
评论
alphasort
'_"
a
A
_
A
a
strcasecmp
qsort
strcasecmp()
str
qsort()
strncasecmp()
的行为就像字符串已转换为小写,然后执行字节比较一样。结果在其他区域设置中未指定。这似乎与(只要所有指针具有相同的表示和调用约定,这是另一个 POSIX 要求。
strcasecmp
qsort