题目
从标准输入读入多个英文单词,存入指针数组中,调用 qsort 库函数按字典序从小到大排序并依次输出。
输入格式:第一行输入单词个数 n;随后 n 行每行输入一个单词。
输出格式:按字典升序输出排序后的单词,每行一个。
数据范围与约定:1 ≤ n ≤ 50,单词长度不超过 30 字符。
思路与算法
1. 指针数组模型char *words[n]; 是一个存放指针的数组,每个指针指向一个单词字符串的首地址,排序时只需交换指针本身,无需大块拷贝字符串。
2. qsort 比较函数规范
比较函数参数为 const void *a, const void *b,强转二级指针 const char **p1 = (const char **)a;,通过 strcmp(*p1, *p2) 比较字符串字典序。
完整程序
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[3][100];
char *w[3]; // 指针数组:每个元素存放一个字符串的首地址
for (int i = 0; i < 3; i++) {
scanf("%99s", buf[i]);
w[i] = buf[i];
}
// 经典优化:排序时仅交换指针指向(8字节),不发生大块字符数组复制
for (int i = 0; i < 2; i++) {
for (int j = i + 1; j < 3; j++) {
if (strcmp(w[i], w[j]) > 0) {
char *t = w[i];
w[i] = w[j];
w[j] = t;
}
}
}
for (int i = 0; i < 3; i++) {
printf("%s\n", w[i]);
}
return 0;
}运行示例
输入:
pear apple fig输出:
apple
fig
pear