如何自定义C语言compare函数实现A<a<B<b…的字符串比较(不用strcmp)
实现自定义字符串比较函数
int compare(char* A, char* B) 核心思路
要满足A<a<B<b<…<Z<z的排序规则,核心是给每个字符分配自定义排序权重,替代ASCII码的默认顺序:
- 大写字母
A-Z:权重为2 * (c - 'A'),比如A对应0,B对应2,…,Z对应50 - 小写字母
a-z:权重为2 * (c - 'a') + 1,比如a对应1,b对应3,…,z对应51
这样就能保证同一字母的大写在前、小写在后,且整体按字母顺序排列。
完整实现代码
#include <string.h> int compare(char* A, char* B) { // 遍历字符串直到遇到结束符或字符不同 while (*A != '\0' && *B != '\0') { int weightA, weightB; // 计算A当前字符的权重 if (*A >= 'A' && *A <= 'Z') { weightA = 2 * (*A - 'A'); } else if (*A >= 'a' && *A <= 'z') { weightA = 2 * (*A - 'a') + 1; } else { // 非字母字符按ASCII码处理(可根据需求调整规则) weightA = *A; } // 计算B当前字符的权重 if (*B >= 'A' && *B <= 'Z') { weightB = 2 * (*B - 'A'); } else if (*B >= 'a' && *B <= 'z') { weightB = 2 * (*B - 'a') + 1; } else { weightB = *B; } // 比较权重并返回结果 if (weightA > weightB) { return 1; } else if (weightA < weightB) { return 0; } // 当前字符相等,继续遍历下一个 A++; B++; } // 处理其中一个字符串已遍历完的情况 if (*A != '\0') { // A还有剩余字符,说明A更大 return 1; } if (*B != '\0') { // B还有剩余字符,说明B更大 return 0; } // 两个字符串完全相同,按需求返回0(可根据场景调整) return 0; }
关键细节说明
- 非字母字符处理:代码中对非字母字符直接使用ASCII码作为权重,若业务不需要处理这类字符,可添加判断逻辑返回特定值或忽略。
- 边界场景覆盖:
- 空字符串:A空B非空返回0,B空A非空返回1,都为空返回0。
- 前缀匹配:比如
A="Abc"、B="Ab",A更长则返回1。
- 性能:字符串最大长度为100,遍历复杂度为O(n),完全满足需求。
内容的提问来源于stack exchange,提问作者Angus Wai
相关产品推荐
相关产品推荐

