文件名就是一个字符串,在对两个文件名进行比较时,当文件名中有数字时,仅仅按照字典序逐个字符的比较会出现如下不合理的情况:
文件:10_a, 11_a, 100_a 排序的结果是10_a, 100_a, 11_a
对文件名排序的比较函数C实现如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int count_digits(const char* s)
{
const char *p = s;
while (isdigit(*p)) {
p++;
}
return (int)(p - s);
}
int compare_str(char *a_ptr, char *b_ptr)
{
char *a = a_ptr, *b = b_ptr;
while (*a != '\0' && *b != '\0') {
/* 如果a和b都是数字 */
if (isdigit(*a) && isdigit(*b)) {
/* a的数字有几位 */
int a_count = count_digits(a);
/* a b 数字的位数是否相同 */
int diff = a_count - count_digits(b);
/* 不同直接根据位数大小判断数字大小 */
if (diff) {
return diff;
}
/* 相同则按内存比较即可 */
diff = memcmp(a, b, a_count);
if (diff) {
return diff;
}
/* 数字一样时,处理指针偏移,继续比较其它部分 */
a += a_count;
b += a_count;
}
if (*a != *b) {
return *a - *b;
}
a++;
b++;
}
/* 两个名字不等长,但字符相同,短的放前面 */
return strlen(b) - strlen(a);
}