#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;
num_a = num_a * 10 + (a[i] - '0');
i++;
}
num_b = num_b * 10 + (b[j] - '0');
j++;
}
// 比较数字大小
if (num_a < num_b) return 1; // a的数字小,a应该排前面
if (num_a > num_b) return -1; // a的数字大,a应该排后面
// 如果数字相同,但前导零不同,比较原始字符串
if (i - start_i != j - start_j) {
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
printf("a = \"grade1-class5-id5-zhangsan\"\n"); printf("b = \"grade01-class10-id2-list\"\n"); printf("实际输出: %d\n\n", compare_filename
("grade1-class5-id5-zhangsan", "grade01-class10-id2-list"));
// 测试用例2
printf("a = \"grade2-class7-id2-wangwu\"\n"); printf("b = \"grade2-class7-id15-zhaoliu\"\n"); printf("实际输出: %d\n\n", compare_filename
("grade2-class7-id2-wangwu", "grade2-class7-id15-zhaoliu"));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCmludCBjb21wYXJlX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpIHsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICAKICAgIHdoaWxlIChhW2ldICE9ICdcMCcgJiYgYltqXSAhPSAnXDAnKSB7CiAgICAgICAgLy8g5aaC5p6c5Lik5Liq5a2X56ym6YO95piv5pWw5a2X77yM5o+Q5Y+W5a6M5pW05pWw5a2X6L+b6KGM5q+U6L6DCiAgICAgICAgaWYgKGlzZGlnaXQoYVtpXSkgJiYgaXNkaWdpdChiW2pdKSkgewogICAgICAgICAgICAvLyDot7Pov4fliY3lr7zpm7YKICAgICAgICAgICAgaW50IHN0YXJ0X2kgPSBpLCBzdGFydF9qID0gajsKICAgICAgICAgICAgd2hpbGUgKGFbaV0gPT0gJzAnKSBpKys7CiAgICAgICAgICAgIHdoaWxlIChiW2pdID09ICcwJykgaisrOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8g5o+Q5Y+W5pWw5a2X5YC8CiAgICAgICAgICAgIGxvbmcgbnVtX2EgPSAwLCBudW1fYiA9IDA7CiAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGFbaV0pKSB7CiAgICAgICAgICAgICAgICBudW1fYSA9IG51bV9hICogMTAgKyAoYVtpXSAtICcwJyk7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoYltqXSkpIHsKICAgICAgICAgICAgICAgIG51bV9iID0gbnVtX2IgKiAxMCArIChiW2pdIC0gJzAnKTsKICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8g5q+U6L6D5pWw5a2X5aSn5bCPCiAgICAgICAgICAgIGlmIChudW1fYSA8IG51bV9iKSByZXR1cm4gMTsgIC8vIGHnmoTmlbDlrZflsI/vvIxh5bqU6K+l5o6S5YmN6Z2iCiAgICAgICAgICAgIGlmIChudW1fYSA+IG51bV9iKSByZXR1cm4gLTE7IC8vIGHnmoTmlbDlrZflpKfvvIxh5bqU6K+l5o6S5ZCO6Z2iCiAgICAgICAgICAgIAogICAgICAgICAgICAvLyDlpoLmnpzmlbDlrZfnm7jlkIzvvIzkvYbliY3lr7zpm7bkuI3lkIzvvIzmr5TovoPljp/lp4vlrZfnrKbkuLIKICAgICAgICAgICAgaWYgKGkgLSBzdGFydF9pICE9IGogLSBzdGFydF9qKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYSA9IGEgKyBzdGFydF9pOwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGIgPSBiICsgc3RhcnRfajsKICAgICAgICAgICAgICAgIHdoaWxlICgqcGEgIT0gJ1wwJyAmJiAqcGIgIT0gJ1wwJyAmJiBpc2RpZ2l0KCpwYSkgJiYgaXNkaWdpdCgqcGIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpwYSA8ICpwYikgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpwYSA+ICpwYikgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIHBhKys7CiAgICAgICAgICAgICAgICAgICAgcGIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gCiAgICAgICAgLy8g5aaC5p6c5Lik5Liq5a2X56ym6YO95piv5a2X5q+N77yM5b+955Wl5aSn5bCP5YaZ5q+U6L6DCiAgICAgICAgZWxzZSBpZiAoaXNhbHBoYShhW2ldKSAmJiBpc2FscGhhKGJbal0pKSB7CiAgICAgICAgICAgIGNoYXIgY2hhcl9hID0gdG9sb3dlcihhW2ldKTsKICAgICAgICAgICAgY2hhciBjaGFyX2IgPSB0b2xvd2VyKGJbal0pOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNoYXJfYSA8IGNoYXJfYikgcmV0dXJuIDE7ICAgLy8gYeeahOWtl+avjeWwj++8jGHlupTor6XmjpLliY3pnaIKICAgICAgICAgICAgaWYgKGNoYXJfYSA+IGNoYXJfYikgcmV0dXJuIC0xOyAgLy8gYeeahOWtl+avjeWkp++8jGHlupTor6XmjpLlkI7pnaIKICAgICAgICAgICAgCiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICAvLyDlhbbku5bmg4XlhrXvvIzmjIkgQVNDSUkg5YC85q+U6L6DCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChhW2ldIDwgYltqXSkgcmV0dXJuIDE7ICAgLy8gYeeahOWtl+espuWwj++8jGHlupTor6XmjpLliY3pnaIKICAgICAgICAgICAgaWYgKGFbaV0gPiBiW2pdKSByZXR1cm4gLTE7ICAvLyBh55qE5a2X56ym5aSn77yMYeW6lOivpeaOkuWQjumdogogICAgICAgICAgICAKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyDlpITnkIbkuIDkuKrlrZfnrKbkuLLnu5PmnZ/nmoTmg4XlhrUKICAgIGlmIChhW2ldID09ICdcMCcgJiYgYltqXSA9PSAnXDAnKSByZXR1cm4gMDsKICAgIGlmIChhW2ldID09ICdcMCcpIHJldHVybiAxOyAgIC8vIGHovoPnn63vvIxh5bqU6K+l5o6S5YmN6Z2iCiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgLy8gYei+g+mVv++8jGHlupTor6XmjpLlkI7pnaIKfQoKLy8g5rWL6K+V5Ye95pWwCmludCBtYWluKCkgewogICAgLy8g5rWL6K+V55So5L6LMQogICAgcHJpbnRmKCLmtYvor5XnlKjkvosxOlxuIik7CiAgICBwcmludGYoImEgPSBcImdyYWRlMS1jbGFzczUtaWQ1LXpoYW5nc2FuXCJcbiIpOwogICAgcHJpbnRmKCJiID0gXCJncmFkZTAxLWNsYXNzMTAtaWQyLWxpc3RcIlxuIik7CiAgICBwcmludGYoIuacn+acm+i+k+WHujogMVxuIik7CiAgICBwcmludGYoIuWunumZhei+k+WHujogJWRcblxuIiwgY29tcGFyZV9maWxlbmFtZSgiZ3JhZGUxLWNsYXNzNS1pZDUtemhhbmdzYW4iLCAiZ3JhZGUwMS1jbGFzczEwLWlkMi1saXN0IikpOwogICAgCiAgICAvLyDmtYvor5XnlKjkvosyCiAgICBwcmludGYoIua1i+ivleeUqOS+izI6XG4iKTsKICAgIHByaW50ZigiYSA9IFwiZ3JhZGUyLWNsYXNzNy1pZDItd2FuZ3d1XCJcbiIpOwogICAgcHJpbnRmKCJiID0gXCJncmFkZTItY2xhc3M3LWlkMTUtemhhb2xpdVwiXG4iKTsKICAgIHByaW50Zigi5pyf5pyb6L6T5Ye6OiAxXG4iKTsKICAgIHByaW50Zigi5a6e6ZmF6L6T5Ye6OiAlZFxuXG4iLCBjb21wYXJlX2ZpbGVuYW1lKCJncmFkZTItY2xhc3M3LWlkMi13YW5nd3UiLCAiZ3JhZGUyLWNsYXNzNy1pZDE1LXpoYW9saXUiKSk7CiAgICAKICAgIHJldHVybiAwOwp9