文件名排序(自然序)

        文件名就是一个字符串,在对两个文件名进行比较时,当文件名中有数字时,仅仅按照字典序逐个字符的比较会出现如下不合理的情况:

        文件: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);
}

 

点赞