我有一个目录列表,我想为其检索文件名并将它们放在字符串向量中,以便它们以“自然”方式排序。例如{ "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" }。最简单的方法是什么?
{ "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。
...(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
glibc中有一个功能 完全可以满足您的需求 。不幸的是,它是C,而不是C ++,因此,如果可以接受的话,这是“开箱即用”的最简单的解决方案,而无需重新实现任何功能和重新设计轮子。顺便说一句:这与ls -lv实施完全相同。其中最重要的部分是为您versionsort执行 自然排序 的功能。在此用作的比较功能scandir。下面的简单示例将按您希望的顺序打印当前目录中的所有文件/目录。
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; }