C语言字母排序不分大小写,如何按字母顺序排序字符串数组(区分大小写,非标准排序规则)...
保持一致的话一起…
对于单词列表,将“相同”的单词组合在一起(即使情况不同)往往更为有用.例如:
Keeping things together: Simple "M after m":
------------------------ -------------------
mars mars
mars bar mars bar
Mars bar milk
milk milk-duds
Milk milky-way
milk-duds Mars bar
milky-way Milk
Milky-way Milky-way
如果你想要排列第一列的单词,我会提出三种方式:
>使用strcasecmp()结合strcmp().
>使用isalpha(),tolower()和isupper()跟踪字符类型的单次执行实现.
>使用整理表的单次执行.
最后我讨论了两个选择:
>使用整理表建立任意排序.
>设置区域设置以使用基于区域设置的整理.
使用可用的库函数
如果可以这样做,请避免重新发明车轮.在这种情况下,我们可以通过使用POSIX函数strcasecmp()来查看它们是否与不区分大小写的比较相等,并在它们之后退回到strcmp().
int alphaBetize (const char *a, const char *b) {
int r = strcasecmp(a, b);
if (r) return r;
/* if equal ignoring case, use opposite of strcmp() result to get
* lower before upper */
return -strcmp(a, b); /* aka: return strcmp(b, a); */
}
(在某些系统上,不区分大小写的比较函数称为stricmp()或_stricmp(),如果您不可用,则在下面提供一个实现)
#ifdef I_DONT_HAVE_STRCASECMP
int strcasecmp (const char *a, const char *b) {
while (*a && *b) {
if (tolower(*a) != tolower(*b)) {
break;
}
++a;
++b;
}
return tolower(*a) - tolower(*b);
}
#endif
避免两次通过字符串
有时,现有的功能表现不够好,你必须做别的事情才能使事情更快.以下功能在单次传递中以大致相同的方式进行比较,而不使用strcasecmp()或strcmp().但是,它将所有非字母字符视为小于字母.
int alphaBetize (const char *a, const char *b) {
int weight = 0;
do {
if (*a != *b) {
if (!(isalpha(*a) && isalpha(*b))) {
if (isalpha(*a) || isalpha(*b)) {
return isalpha(*a) - isalpha(*b);
}
return *a - *b;
}
if (tolower(*a) != tolower(*b)) {
return tolower(*a) - tolower(*b);
}
/* treat as equal, but mark the weight if not set */
if (weight == 0) {
weight = isupper(*a) - isupper(*b);
}
}
++a;
++b;
} while (*a && *b);
/* if the words compared equal, use the weight as tie breaker */
if (*a == *b) {
return weight;
}
return !*b - !*a;
}
使用这种比较进行排序将保持牛奶和牛奶相邻,即使列表包括牛奶.
使用整理表
这是一种从“配置”动态创建整理表的方法.它用于说明一种对比技术来改变字符串的比较.
您可以映射字母表中的字母与一种简单的表格,描述您想要的字母(或NUL字节之外的任何字符)的相对顺序:
const char * alphaBetical =
"aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
从这个顺序,我们可以创建一个查找表,看看两个字母应该相互比较.以下函数初始化表,如果还没有首先完成,否则执行表查找.
int alphaBeta_lookup (int c) {
static int initialized;
static char table[CHAR_MAX+1];
if (!initialized) {
/* leave all non-alphaBeticals in their relative order, but below
alphaBeticals */
int i, j;
for (i = j = 1; i < CHAR_MAX+1; ++i) {
if (strchr(alphaBetical, i)) continue;
table[i] = j++;
}
/* now run through the alphaBeticals */
for (i = 0; alphaBetical[i]; ++i) {
table[(int)alphaBetical[i]] = j++;
}
initialized = 1;
}
/* return the computed ordinal of the provided character */
if (c < 0 || c > CHAR_MAX) return c;
return table[c];
}
使用这个查找表,我们现在可以简化alphaBetize()比较函数的循环体:
int alphaBetize (const char *a, const char *b) {
int ax = alphaBeta_lookup(*a);
int bx = alphaBeta_lookup(*b);
int weight = 0;
do {
char al = tolower(*a);
char bl = tolower(*b);
if (ax != bx) {
if (al != bl) {
return alphaBeta_lookup(al) - alphaBeta_lookup(bl);
}
if (weight == 0) {
weight = ax - bx;
}
}
ax = alphaBeta_lookup(*++a);
bx = alphaBeta_lookup(*++b);
} while (ax && bx);
/* if the words compared equal, use the weight as tie breaker */
return (ax != bx) ? !bx - !ax : weight;
}
我们可以让事情更简单吗?
使用整理表,您可以使用简化的比较功能创建许多不同的排序,如:
int simple_collating (const char *a, const char *b) {
while (alphaBeta_lookup(*a) == alphaBeta_lookup(*b)) {
if (*a == '\0') break;
++a, ++b;
}
return alphaBeta_lookup(*a) - alphaBeta_lookup(*b);
}
使用这个相同的功能,通过修改alphaBetical字符串,你可以实现几乎任何你想要的排序(按字母顺序排列,按字母顺序排列,辅音前的元音等).然而,保持一致的单词的安排需要散布大写字母的小写字母,这只能通过做一个比较忽略的情况来完成.
请注意,使用上面的simple_collating()函数和我提供的alphaBetical字符串,培根将会在牛奶之前,但是火星会在牛奶之后和牛奶之前.
如果要根据您的区域设置进行排序.
如果要使用已为您的区域设置定义的整理顺序,可以设置区域设置并调用整理比较功能:
/*
* To change the collating locale, use (for example):
setlocale(LC_COLLATE, "en.US");
*/
int iso_collating (const char *a, const char *b) {
return strcoll(a, b);
}
现在,通过更改区域设置,排序顺序将基于标准化的整理顺序.
C语言字母排序不分大小写,如何按字母顺序排序字符串数组(区分大小写,非标准排序规则)...相关推荐
- Java黑皮书课后题第8章:*8.27(列排序)用下面的方法实现一个二维数组中的列排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
*8.27(列排序)用下面的方法实现一个二维数组中的列排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...
- Java黑皮书课后题第8章:*8.26(行排序)用下面的方法实现一个二维数组中的行排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
*8.26(行排序)用下面的方法实现一个二维数组中的行排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...
- Java实验——定义一个类,该类中包含以下几个方法(静态):实现两个字符串数组的逆序排序,输出结果为字符串数组;求两个整形数组的交集;求两个浮点型数组的并集;
目录 一.实现两个字符串数组的逆序排序,输出结果为字符串数组 解题思路: 具体代码: 运行截图: 二.求两个整形数组的交集 具体代码: 运行截图: 三.求两个浮点型数组的并集 解题思路: 具体代码: ...
- html的标记符一般不分大小写,HTML5标记符的属性一般不区分大小写。
[单选题]因调查对象有意掩盖某些信息而导致的偏倚为 [单选题]队员犯有"打或企图打对方队员"的犯规时是否需要被罚令出场?() [多选题]下述诉讼中,实行"被告就原告&qu ...
- 以行为单位对字符串变量下标为奇数位置上的字符按其ASCii值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中
#include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h&g ...
- JAVA 字符串数组按照ACCII码表排序
本人在开发过程中,对接文档要求非空参数需要按照ACCII码表排序,然后才能传递,整理了下 ! 方法代码: public static void sortStringList(List<Strin ...
- c语言中怎样变大输出的字符串,C语言。要输入一个超大数比如 111111111111111111111111111111111111111 怎样用字符串数组求各位的和呢?...
满意答案 muwen3798 2014.01.04 采纳率:45% 等级:13 已帮助:9415人 这个超大数不是10的100次方个数,而是一个数,只不过有100位,那么我们会用一个整型的数据存 ...
- 实验7-3-3 统计大写辅音字母(15 分)
实验7-3-3 统计大写辅音字母(15 分) 英文辅音字母是除A.E.I.O.U以外的字母.本题要求编写程序,统计给定字符串中大写辅音字母的个数.输入格式: 输入在一行中给出一个不超过80个字符.并以 ...
- 7-21 统计大写辅音字母 (15 分)
7-21 统计大写辅音字母 (15 分) 英文辅音字母是除A.E.I.O.U以外的字母.本题要求编写程序,统计给定字符串中大写辅音字母的个数. 输入格式: 输入在一行中给出一个不超过80个字符.并以回 ...
- Java字符串数组字典序排序
Java字典序排序 1. String[] 字符串数组 1) 正序排序 2)逆序排序 2. String 字符串 3. int[] 整数数组 4.int[]降序排序 5.int[]两个条件排序 1. ...
最新文章
- java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
- esxi忘记密码重置方法
- 正在经历变革的 Linux 系统管理员技能
- MySQL索引原理总结
- 【Android Jetpack】彻底弄清Navigation的BackStack如何变化
- 定义一个方法用于判断一个字符串是否是对称的字符串(StringBuilder),例如:abcba、上海自来水来自海上均为对称字符串。
- MSP430番外——BSL介绍
- php guzzle的基本使用
- 图片怎么转成PDF格式?介绍三种转换思路
- 命令行提示符参数PS1, 但是不会自动换行
- 中国ORC低温余热发电系统市场深度调研报告(2023版)
- 百度百科计算机科学与技术,徐明伟(清华大学计算机科学与技术系教授)_百度百科...
- 华为云云商店星品入“沪”,加速产业数字共赢!
- java做百度语言识别_java实现百度云文字识别接口代码
- JD旗舰店店铺商品详情接口代码对接教程
- 分布式电商项目 谷粒商城 学习笔记<2>
- 天地图服务在https协议下请求正常加载显示地图
- 中投民生:两名“考生”齐聚科创板联袂续写市场化“答卷”
- 成为一流软件开发者的 34 条建议
- JavaSE Day14 异常 泛型
热门文章
- 计算机潮流分析22节点,第三章电力系统潮流分析与计算第七讲电力网络方程和矩阵及功率方程_255903070...
- 关于word-break和word-wrap的使用和区别
- 学计算机物理去戴维斯还是伦斯勒理工学院好,为什么伦斯勒理工学院评价那么高?...
- IDEA - 如何安装Statistic代码统计插件?
- cocos2dx 精灵增加触摸事件
- ffmpeg生成的视频与QuickTime不兼容
- segmentation fault
- 无线基础知识学习(一)
- 信创办公--基于WPS的Word最佳实践系列(解决Word兼容性问题)
- 学习记录2——PMSM数学建模——坐标变换理论以及相应的Matlab模块搭建