文件名排序(自然序)

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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值