C语言字符数组先按数值升序后按字母顺序排序的实现方法
C语言混合字符数组排序实现
实现逻辑
- 遍历原数组,拆分出所有数字字符、字母字符分别存储
- 数字字符排序:按数值升序排列,0放在数字序列末尾(匹配给出的目标输出格式)
- 字母字符排序:按a-z字典序升序排列
- 按「排序后数字串 + 排序后字母串」拼接得到最终结果
完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 数字比较函数:数值升序,0放最后 int cmp_num(const void *a, const void *b) { char c1 = *(char*)a; char c2 = *(char*)b; if (c1 == '0') return 1; if (c2 == '0') return -1; return c1 - c2; } // 字母比较函数:a-z升序 int cmp_alpha(const void *a, const void *b) { return *(char*)a - *(char*)b; } int main() { char src[] = "38ch50ej16af49di27bg"; char nums[20] = {0}, alphas[20] = {0}, res[40] = {0}; int num_cnt = 0, alpha_cnt = 0; // 拆分数字和字母 for (int i = 0; i < strlen(src); i++) { if (isdigit(src[i])) { nums[num_cnt++] = src[i]; } else if (isalpha(src[i])) { alphas[alpha_cnt++] = src[i]; } } // 分别排序 qsort(nums, num_cnt, sizeof(char), cmp_num); qsort(alphas, alpha_cnt, sizeof(char), cmp_alpha); // 拼接结果 strcat(res, nums); strcat(res, alphas); printf("%s\n", res); return 0; }
运行输出
1234567890abcdefghij
注意事项
- 如果需要数字严格按0-9升序排列(0放在数字序列开头),直接删除
cmp_num函数中两个关于0的判断逻辑,仅保留return c1 - c2;即可 - 代码默认所有字母大小写一致,若存在大小写混合场景,可在比较前先将字符统一转成小写/大写再做差值比较
内容的提问来源于stack exchange,提问作者kikikey
相关产品推荐
相关产品推荐

