要求: 按照字母顺序排列,不区分大小写.
例: a(ASClL码97) 应该排列在 B(ASCLL码66)的前面.
A(ASClL码65) 也应该排列在 B(ASCLL码66)的前面.
思路1:统一字符大小写,将所有字母统一改为小写,即ASCLLL码在65~90范围的字母,加上32,转换为小写,再根据ASCLL码由小到大排序.
问题: ASCLLL码在65~90范围的字母,加上32,转换为小写, 暂时无法实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #include <string.h> #define M 8 int main() { char *str[M] = {"BASIC", "Computer", "design", "FORTRAN", "Follow", "me", "Great", "Wall"};
for (int i = 0; i < M; i++) { for (int j = 0; j < strlen(str[i]); j++) { if ((int)*(str[i] + j) < 97) { printf("%c ", *(str[i] + j) + 32); } } printf("%s ", str[i]); } return 0; }
|
解决:strlwr()函数,将所有大写字母转化为小写.
将指针字符数组改为二维数组
新定义一个二维数组str1,将str复制到str1,目的是将操作都在str1中执行,不改变原数组中的内容。
利用strlwr()函数,将str1中字母都转为小写后,应用strcmp()函数比较str1的ASCLL码大小,对两个数组都进行冒泡排序,即str与str1的存储顺序将会保持一致,不一样的只是str中含有大写,而str1中都转为了小写,不含有大写字母。
最后输出str数组。
为什么要先转为小写再比较?
并不是非要转为小写,利用strupr()函数转为大写也可以,目的是统一大小写。
否则直接排序会将大写的全部先输出了,再输出小写的。(因为ASCLL码中大写字母比小写字母小),即 B 将会 排序 到 a 前面,但这并不是我们想要的排序结果。
实现代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <stdio.h> #include <string.h> #define M 8 #define N 10 int main() { char str[M][N] = {"BASIC", "Computer", "design", "ancestor", "Follow", "English", "Great", "Horion"}, str1[M][N]; for (int i = 0; i < M; i++) { strcpy(str1[i], str[i]); strlwr(str1[i]); } for (int j = 0; j < M; j++) { for (int i = 0; i < M - j - 1; i++) { if (strcmp(str1[i], str1[i + 1]) > 0) { char temp[N]; strcpy(temp, str[i]); strcpy(str[i], str[i + 1]); strcpy(str[i + 1], temp);
strcpy(temp, str1[i]); strcpy(str1[i], str1[i + 1]); strcpy(str1[i + 1], temp); } } } for (int i = 0; i < M; i++) { printf("%s ", str[i]); } return 0; }
|