fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. int compare_filename(const char *a, const char *b) {
  7. int i = 0, j = 0;
  8.  
  9. while (a[i] != '\0' && b[j] != '\0') {
  10. // 如果两个字符都是数字,提取完整数字进行比较
  11. if (isdigit(a[i]) && isdigit(b[j])) {
  12. // 跳过前导零,但要记录位置
  13. int start_i = i, start_j = j;
  14. while (a[i] == '0') i++;
  15. while (b[j] == '0') j++;
  16.  
  17. // 提取数字值
  18. long num_a = 0, num_b = 0;
  19. int len_a = 0, len_b = 0;
  20.  
  21. while (isdigit(a[i])) {
  22. num_a = num_a * 10 + (a[i] - '0');
  23. i++;
  24. len_a++;
  25. }
  26. while (isdigit(b[j])) {
  27. num_b = num_b * 10 + (b[j] - '0');
  28. j++;
  29. len_b++;
  30. }
  31.  
  32. // 比较数字大小
  33. if (num_a < num_b) return 1; // a的数字小,a应该排前面
  34. if (num_a > num_b) return -1; // a的数字大,a应该排后面
  35.  
  36. // 如果数字值相同,但前导零不同,比较原始数字字符串
  37. if (len_a != len_b) {
  38. const char *pa = a + start_i;
  39. const char *pb = b + start_j;
  40. while (isdigit(*pa) && isdigit(*pb)) {
  41. if (*pa < *pb) return 1;
  42. if (*pa > *pb) return -1;
  43. pa++;
  44. pb++;
  45. }
  46. }
  47. }
  48. // 如果两个字符都是字母,忽略大小写比较
  49. else if (isalpha(a[i]) && isalpha(b[j])) {
  50. char char_a = tolower(a[i]);
  51. char char_b = tolower(b[j]);
  52.  
  53. if (char_a < char_b) return 1; // a的字母小,a应该排前面
  54. if (char_a > char_b) return -1; // a的字母大,a应该排后面
  55.  
  56. i++;
  57. j++;
  58. }
  59. // 其他情况,按 ASCII 值比较
  60. else {
  61. if (a[i] < b[j]) return 1; // a的字符小,a应该排前面
  62. if (a[i] > b[j]) return -1; // a的字符大,a应该排后面
  63.  
  64. i++;
  65. j++;
  66. }
  67. }
  68.  
  69. // 处理一个字符串结束的情况
  70. if (a[i] == '\0' && b[j] == '\0') return 0;
  71. if (a[i] == '\0') return 1; // a较短,a应该排前面
  72. return -1; // a较长,a应该排后面
  73. }
  74.  
  75. // 测试函数
  76. int main() {
  77. // 测试用例1
  78. printf("测试用例1:\n");
  79. const char *a1 = "grade1-class5-id5-zhangsan";
  80. const char *b1 = "grade01-class10-id2-list";
  81. printf("a = \"%s\"\n", a1);
  82. printf("b = \"%s\"\n", b1);
  83. printf("期望输出: 1\n");
  84. printf("实际输出: %d\n\n", compare_filename(a1, b1));
  85.  
  86. // 调试信息
  87. printf("调试测试用例1:\n");
  88. printf("grade1 vs grade01: 数字1 == 1\n");
  89. printf("class5 vs class10: 数字5 < 10,所以a应该排在b前面\n");
  90. printf("因此应该返回1\n\n");
  91.  
  92. // 测试用例2
  93. printf("测试用例2:\n");
  94. const char *a2 = "grade2-class7-id2-wangwu";
  95. const char *b2 = "grade2-class7-id15-zhaoliu";
  96. printf("a = \"%s\"\n", a2);
  97. printf("b = \"%s\"\n", b2);
  98. printf("期望输出: 1\n");
  99. printf("实际输出: %d\n\n", compare_filename(a2, b2));
  100.  
  101. return 0;
  102. }
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
测试用例1:
a = "grade1-class5-id5-zhangsan"
b = "grade01-class10-id2-list"
期望输出: 1
实际输出: 1

调试测试用例1:
grade1 vs grade01: 数字1 == 1
class5 vs class10: 数字5 < 10,所以a应该排在b前面
因此应该返回1

测试用例2:
a = "grade2-class7-id2-wangwu"
b = "grade2-class7-id15-zhaoliu"
期望输出: 1
实际输出: 1