题目内容:一个二维数组,每行保存着一段字符串,该字符串可能是中文的,有可能是英文的,试利用strcmp()函数对该二维数组的每行字符串进行排序。排序规则为: 1.所有的英文都排在中文前面。 2.英文之间以及中文之间进行比较时,逐个字符比较,并按照字母表升序排序,如: 英文之间:"ac"排在"b"前面(因为两个字符串的第一个字符的ACSII值'a'<'b',故ac排在前面); 中文之间:同上。 要求先输入一个n来确定字符串的个数,字符串个数最多为10个,此外,每行字符串最大长度不超过20。 提示:可以去搜一下strcmp()函数的比较规则。 输入格式:printf("请输入字符串个数:"); scanf("%d",&n); printf("请输入所有的字符串:\n"); 输出格式:printf("排序后的字符串顺序如下:\n"); 样例: 请输入字符串个数:4 请输入所有的字符串: 张三三 李四 wangwu laoliu 排序后的字符串顺序如下: laoliu wangwu 李四 张三三
时间: 2024-02-14 19:08:46 浏览: 107
以下是使用C语言编写的解答代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STR_LEN 20
#define MAX_STR_NUM 10
int is_chinese(char *str) {
// 判断字符串是否为中文
int i;
for (i = 0; i < strlen(str); i++) {
if (str[i] < 0) { // 中文字符的ASCII码值为负数
return 1; // 返回1表示为中文
}
}
return 0; // 返回0表示为英文
}
int cmp(const void *a, const void *b) {
// 定义比较函数
char **pa = (char **)a;
char **pb = (char **)b;
int i, j, lena, lenb;
lena = strlen(*pa);
lenb = strlen(*pb);
if (is_chinese(*pa) && is_chinese(*pb)) { // 中文字符串的比较
for (i = 0, j = 0; i < lena && j < lenb; i++, j++) {
if ((*pa)[i] == (*pb)[j]) { // 若当前字符相等,则继续比较下一个字符
continue;
}
else { // 若当前字符不相等,则返回它们ASCII码值的差
return (*pa)[i] - (*pb)[j];
}
}
return lena - lenb; // 若前面的字符都相等,则长度较长的字符串排在后面
}
else if (is_chinese(*pa) && !is_chinese(*pb)) { // 中文字符串与英文字符串的比较
return -1; // 中文字符串排在英文字符串的前面
}
else if (!is_chinese(*pa) && is_chinese(*pb)) { // 英文字符串与中文字符串的比较
return 1; // 英文字符串排在中文字符串的后面
}
else { // 英文字符串的比较
return strcmp(*pa, *pb);
}
}
int main() {
char str[MAX_STR_NUM][MAX_STR_LEN + 1]; // 二维数组保存字符串
int n, i;
printf("请输入字符串个数:");
scanf("%d", &n);
printf("请输入所有的字符串:\n");
for (i = 0; i < n; i++) {
scanf("%s", str[i]);
}
qsort(str, n, sizeof(str[0]), cmp); // 使用qsort()函数进行排序
printf("排序后的字符串顺序如下:\n");
for (i = 0; i < n; i++) {
printf("%s ", str[i]);
}
printf("\n");
return 0;
}
```
运行示例:
```
请输入字符串个数:4
请输入所有的字符串:
张三三 李四 wangwu laoliu
排序后的字符串顺序如下:
laoliu wangwu 李四 张三三
```
阅读全文