#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int compare_filename(const char *a, const char *b) {
int i = 0, j = 0;
while (a[i] != '\0' && b[j] != '\0') {
// 如果两个字符都是数字,提取完整数字进行比较
// 跳过前导零,但要记录位置
int start_i = i, start_j = j;
while (a[i] == '0') i++;
while (b[j] == '0') j++;
// 提取数字值
long num_a = 0, num_b = 0;
int len_a = 0, len_b = 0;
num_a = num_a * 10 + (a[i] - '0');
i++;
len_a++;
}
num_b = num_b * 10 + (b[j] - '0');
j++;
len_b++;
}
// 比较数字大小
if (num_a < num_b) return 1; // a的数字小,a应该排前面
if (num_a > num_b) return -1; // a的数字大,a应该排后面
// 如果数字值相同,但前导零不同,比较原始数字字符串
if (len_a != len_b) {
const char *pa = a + start_i;
const char *pb = b + start_j;
if (*pa < *pb) return 1;
if (*pa > *pb) return -1;
pa++;
pb++;
}
}
}
// 如果两个字符都是字母,忽略大小写比较
if (char_a < char_b) return 1; // a的字母小,a应该排前面
if (char_a > char_b) return -1; // a的字母大,a应该排后面
i++;
j++;
}
// 其他情况,按 ASCII 值比较
else {
if (a[i] < b[j]) return 1; // a的字符小,a应该排前面
if (a[i] > b[j]) return -1; // a的字符大,a应该排后面
i++;
j++;
}
}
// 处理一个字符串结束的情况
if (a[i] == '\0' && b[j] == '\0') return 0;
if (a[i] == '\0') return 1; // a较短,a应该排前面
return -1; // a较长,a应该排后面
}
// 测试函数
int main() {
// 测试用例1
const char *a1 = "grade1-class5-id5-zhangsan";
const char *b1 = "grade01-class10-id2-list";
printf("实际输出: %d\n\n", compare_filename
(a1
, b1
));
// 调试信息
printf("grade1 vs grade01: 数字1 == 1\n"); printf("class5 vs class10: 数字5 < 10,所以a应该排在b前面\n");
// 测试用例2
const char *a2 = "grade2-class7-id2-wangwu";
const char *b2 = "grade2-class7-id15-zhaoliu";
printf("实际输出: %d\n\n", compare_filename
(a2
, b2
));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCmludCBjb21wYXJlX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpIHsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICAKICAgIHdoaWxlIChhW2ldICE9ICdcMCcgJiYgYltqXSAhPSAnXDAnKSB7CiAgICAgICAgLy8g5aaC5p6c5Lik5Liq5a2X56ym6YO95piv5pWw5a2X77yM5o+Q5Y+W5a6M5pW05pWw5a2X6L+b6KGM5q+U6L6DCiAgICAgICAgaWYgKGlzZGlnaXQoYVtpXSkgJiYgaXNkaWdpdChiW2pdKSkgewogICAgICAgICAgICAvLyDot7Pov4fliY3lr7zpm7bvvIzkvYbopoHorrDlvZXkvY3nva4KICAgICAgICAgICAgaW50IHN0YXJ0X2kgPSBpLCBzdGFydF9qID0gajsKICAgICAgICAgICAgd2hpbGUgKGFbaV0gPT0gJzAnKSBpKys7CiAgICAgICAgICAgIHdoaWxlIChiW2pdID09ICcwJykgaisrOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g5o+Q5Y+W5pWw5a2X5YC8CiAgICAgICAgICAgIGxvbmcgbnVtX2EgPSAwLCBudW1fYiA9IDA7CiAgICAgICAgICAgIGludCBsZW5fYSA9IDAsIGxlbl9iID0gMDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGFbaV0pKSB7CiAgICAgICAgICAgICAgICBudW1fYSA9IG51bV9hICogMTAgKyAoYVtpXSAtICcwJyk7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICBsZW5fYSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGJbal0pKSB7CiAgICAgICAgICAgICAgICBudW1fYiA9IG51bV9iICogMTAgKyAoYltqXSAtICcwJyk7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBsZW5fYisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDmr5TovoPmlbDlrZflpKflsI8KICAgICAgICAgICAgaWYgKG51bV9hIDwgbnVtX2IpIHJldHVybiAxOyAgLy8gYeeahOaVsOWtl+Wwj++8jGHlupTor6XmjpLliY3pnaIKICAgICAgICAgICAgaWYgKG51bV9hID4gbnVtX2IpIHJldHVybiAtMTsgLy8gYeeahOaVsOWtl+Wkp++8jGHlupTor6XmjpLlkI7pnaIKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOWmguaenOaVsOWtl+WAvOebuOWQjO+8jOS9huWJjeWvvOmbtuS4jeWQjO+8jOavlOi+g+WOn+Wni+aVsOWtl+Wtl+espuS4sgogICAgICAgICAgICBpZiAobGVuX2EgIT0gbGVuX2IpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhID0gYSArIHN0YXJ0X2k7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYiA9IGIgKyBzdGFydF9qOwogICAgICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoKnBhKSAmJiBpc2RpZ2l0KCpwYikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKnBhIDwgKnBiKSByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBpZiAoKnBhID4gKnBiKSByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgcGErKzsKICAgICAgICAgICAgICAgICAgICBwYisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgICAvLyDlpoLmnpzkuKTkuKrlrZfnrKbpg73mmK/lrZfmr43vvIzlv73nlaXlpKflsI/lhpnmr5TovoMKICAgICAgICBlbHNlIGlmIChpc2FscGhhKGFbaV0pICYmIGlzYWxwaGEoYltqXSkpIHsKICAgICAgICAgICAgY2hhciBjaGFyX2EgPSB0b2xvd2VyKGFbaV0pOwogICAgICAgICAgICBjaGFyIGNoYXJfYiA9IHRvbG93ZXIoYltqXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY2hhcl9hIDwgY2hhcl9iKSByZXR1cm4gMTsgICAvLyBh55qE5a2X5q+N5bCP77yMYeW6lOivpeaOkuWJjemdogogICAgICAgICAgICBpZiAoY2hhcl9hID4gY2hhcl9iKSByZXR1cm4gLTE7ICAvLyBh55qE5a2X5q+N5aSn77yMYeW6lOivpeaOkuWQjumdogogICAgICAgICAgICAKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIC8vIOWFtuS7luaDheWGte+8jOaMiSBBU0NJSSDlgLzmr5TovoMKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGFbaV0gPCBiW2pdKSByZXR1cm4gMTsgICAvLyBh55qE5a2X56ym5bCP77yMYeW6lOivpeaOkuWJjemdogogICAgICAgICAgICBpZiAoYVtpXSA+IGJbal0pIHJldHVybiAtMTsgIC8vIGHnmoTlrZfnrKblpKfvvIxh5bqU6K+l5o6S5ZCO6Z2iCiAgICAgICAgICAgIAogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIOWkhOeQhuS4gOS4quWtl+espuS4sue7k+adn+eahOaDheWGtQogICAgaWYgKGFbaV0gPT0gJ1wwJyAmJiBiW2pdID09ICdcMCcpIHJldHVybiAwOwogICAgaWYgKGFbaV0gPT0gJ1wwJykgcmV0dXJuIDE7ICAgLy8gYei+g+efre+8jGHlupTor6XmjpLliY3pnaIKICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAvLyBh6L6D6ZW/77yMYeW6lOivpeaOkuWQjumdogp9CgovLyDmtYvor5Xlh73mlbAKaW50IG1haW4oKSB7CiAgICAvLyDmtYvor5XnlKjkvosxCiAgICBwcmludGYoIua1i+ivleeUqOS+izE6XG4iKTsKICAgIGNvbnN0IGNoYXIgKmExID0gImdyYWRlMS1jbGFzczUtaWQ1LXpoYW5nc2FuIjsKICAgIGNvbnN0IGNoYXIgKmIxID0gImdyYWRlMDEtY2xhc3MxMC1pZDItbGlzdCI7CiAgICBwcmludGYoImEgPSBcIiVzXCJcbiIsIGExKTsKICAgIHByaW50ZigiYiA9IFwiJXNcIlxuIiwgYjEpOwogICAgcHJpbnRmKCLmnJ/mnJvovpPlh7o6IDFcbiIpOwogICAgcHJpbnRmKCLlrp7pmYXovpPlh7o6ICVkXG5cbiIsIGNvbXBhcmVfZmlsZW5hbWUoYTEsIGIxKSk7CiAgICAKICAgIC8vIOiwg+ivleS/oeaBrwogICAgcHJpbnRmKCLosIPor5XmtYvor5XnlKjkvosxOlxuIik7CiAgICBwcmludGYoImdyYWRlMSB2cyBncmFkZTAxOiDmlbDlrZcxID09IDFcbiIpOwogICAgcHJpbnRmKCJjbGFzczUgdnMgY2xhc3MxMDog5pWw5a2XNSA8IDEw77yM5omA5LulYeW6lOivpeaOkuWcqGLliY3pnaJcbiIpOwogICAgcHJpbnRmKCLlm6DmraTlupTor6Xov5Tlm54xXG5cbiIpOwogICAgCiAgICAvLyDmtYvor5XnlKjkvosyCiAgICBwcmludGYoIua1i+ivleeUqOS+izI6XG4iKTsKICAgIGNvbnN0IGNoYXIgKmEyID0gImdyYWRlMi1jbGFzczctaWQyLXdhbmd3dSI7CiAgICBjb25zdCBjaGFyICpiMiA9ICJncmFkZTItY2xhc3M3LWlkMTUtemhhb2xpdSI7CiAgICBwcmludGYoImEgPSBcIiVzXCJcbiIsIGEyKTsKICAgIHByaW50ZigiYiA9IFwiJXNcIlxuIiwgYjIpOwogICAgcHJpbnRmKCLmnJ/mnJvovpPlh7o6IDFcbiIpOwogICAgcHJpbnRmKCLlrp7pmYXovpPlh7o6ICVkXG5cbiIsIGNvbXBhcmVfZmlsZW5hbWUoYTIsIGIyKSk7CiAgICAKICAgIHJldHVybiAwOwp9