我正在尝试编写一个简单的函数来对目录的内容进行排序。事情是,它按字母顺序排列,无论是大写还是小写。我想按ASCII顺序对这些内容进行排序。
示例:我有4个文件,名为Art,boat,Cat和donkey。我的实际代码按此顺序排序,而我想要艺术,猫,船和驴。
void list_dir(char *str){
DIR *rep = NULL;
struct dirent* read_file = NULL;
rep = opendir(str);
if (!rep)
{
ft_putstr("ft_ls: ");
perror(str);
ft_putchar('\n');
}
while((read_file = readdir(rep)) != NULL)
{
if (read_file->d_name[0] != '.')
{
ft_putstr(read_file->d_name);
ft_putchar('\n');
}
}
}
答案 0 :(得分:0)
readdir(3)通常不排序,它按目录顺序列出条目。如果列表已排序,则文件是按顺序创建的,或者操作系统对它们进行排序。
为了自己对输出进行排序,请将名称列表放入一个数组中,然后对其进行排序,例如:使用qsort(3)和strcmp(3)。
或者,只需通过sort(1)管道输出。确保LC_COLLATION
环境变量设置正确。例如,运行./yourprogram | (unset LC_ALL; LC_CTYPE=en_US.UTF-8 LC_COLLATE=C sort)
。
答案 1 :(得分:0)
通过用户定义的过滤器&调用 scandir 比较器是一个简单的解决方案imho。这是代码:
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
static int my_dir_filter(const struct dirent* dir);
static int my_dir_comparator(const struct dirent**, const struct dirent**);
int main(int argc, char* const* argv) {
struct dirent** ent_list_ = NULL;
int r = scandir(".", &ent_list_, my_dir_filter, my_dir_comparator);
for (int i = 0; i < r; ++i)
printf("No. %-3d [%s]\n", i + 1, ent_list_[i]->d_name);
for (int i = 0; i < r; ++i)
free(ent_list_[i]);
free(ent_list_);
return r < 0 ? 1 : 0;
}
int my_dir_filter(const struct dirent* dir) {
return (dir->d_type == DT_REG) ? 1 : 0;
}
int my_dir_comparator(const struct dirent** lhs, const struct dirent** rhs) {
return strcasecmp((*lhs)->d_name, (*rhs)->d_name);
}
测试结果:
$ ls|LANG=C sort ## in ASCII order
Art
Cat
boat
donkey
$ ../a.out ## in my_dir_comparator order
No. 1 [Art]
No. 2 [boat]
No. 3 [Cat]
No. 4 [donkey]