要求: 按照字母顺序排列,不区分大小写.

例: 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) //判断大写字母
{
// *(str[i]+j)+=32;
printf("%c ", *(str[i] + j) + 32);
}
// printf("%c ",*(str[i]+j));
}
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]); //复制到str1,不改变内容,只改变顺序.
strlwr(str1[i]); //将str1改为小写输出
}
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;
}
//输出
// ancestor BASIC Computer design English Follow Great Horion