C ++中目录文件名的自然排序

发布于 2021-02-01 16:48:05

我有一个目录列表,我想为其检索文件名并将它们放在字符串向量中,以便它们以“自然”方式排序。例如{ "10.txt" "0.txt" "2.txt" "1.m" "Jan12" "July13.txt" "Nov25.txt" "Jane" "John" }应该是{"0.txt" "1.m" "2.txt" "10.txt" "Jan12" "July13.txt" "Nov25.txt" "Jane" "John" }。最简单的方法是什么?

在阐述“自然”,我们假设从号码的部分组成的字符串 (N) 和文本 (T)
这样...(N)(T)...,那么对于...(N1)(T1)......(N2)(T2)...(N1<N2) (<) (T1<T2),其中 (<)暗示了正确的长期左边项优先。在这种情况下,如果数字在字符串中的相同位置(即),则数字优先于文本字段1.z (<) 1_t.txt

已经有一个库函数可以对字母数字字符串或目录条目进行这种排序吗?

所需的 文件 顺序 。文件名将存储在字符串向量中。

Abhinav@Abhinav-PC /cygdrive/c/AbhinavSamples/shell
$ ls -lv
total 8
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 1.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:55 1_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:50 3.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 4.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 10.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 10_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 13.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 20.txt

**Simple Sort**
Abhi@Abhi-PC /cygdrive/c/AbhinavSamples/shell
$ ls -l
total 8
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 1.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 10.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 10_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 13.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:55 1_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 20.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:50 3.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 4.txt
关注者
0
被浏览
77
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    glibc中有一个功能 完全可以满足您的需求 。不幸的是,它是C,而不是C
    ++,因此,如果可以接受的话,这是“开箱即用”的最简单的解决方案,而无需重新实现任何功能和重新设计轮子。顺便说一句:这与ls -lv实施完全相同。其中最重要的部分是为您versionsort执行 自然排序
    的功能。在此用作的比较功能scandir。下面的简单示例将按您希望的顺序打印当前目录中的所有文件/目录。

    #define _GNU_SOURCE
    #include <dirent.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(void)
    {
        struct dirent **namelist;
        int n,i;
    
        n = scandir(".", &namelist, 0, versionsort);
        if (n < 0)
            perror("scandir");
        else
        {
            for(i =0 ; i < n; ++i)
            {
                printf("%s\n", namelist[i]->d_name);
                free(namelist[i]);
            }
            free(namelist);
        }
        return 0;
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看