题目

从标准输入读入多个英文单词,存入指针数组中,调用 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