C语言编写一个使用字符型指针数组对学生姓名字符串进行排序的程序。

问题遇到的现象和发生背景

C语言编写一个使用字符型指针数组对学生姓名字符串进行排序的程序。
编程要求
写一个程序,把键盘输入的一组学生的姓名字符串存入一个字符型指针数组中,然后选择一种排序方法对其进行升序排序。要求字符型指针数组中的每个指针指向的空间都要动态申请。
提示:可以先用一个字符型数组过渡,接受键盘输入的字符串,再根据字符串的长度动态申请空间,并让字符指针数组的指针指向它,最后再把字符数组中的字符串复制到指针所指向的空间。

我想要达到的结果

测试输入: 5
zhangli zhaoyi songjiang wanghai lidan
预期输出: lidan songjiang wanghai zhangli zhaoyi

下面是一个实现,供参考:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100

int main(void){
    
    char * names[100];  
    
    char temp[30];
    
    int num;
    printf("测试输入:"); 
    scanf("%d",&num);    //获取输入的学生名字的个数 
    
    int i=0;
    
    while(i<num){  //循环读取num个学生名字到names字符指针指向的空间中 
        //printf("请输入第%d个学生的姓名:",i+1); 
        scanf("%s",temp);  //读取一个学生名字到字符数组temp 
        //动态分配学生名字的长度+1个字符空间(1用于存储名字结尾的空字符),然后将字符指针数组的当前元素指向这个空间 
        names[i] = (char *)malloc((strlen(temp)+1)*sizeof(char));  
        strcpy(names[i],temp);  //把学生名字字符串复制到字符指针指向的内存空间 
        
        i++;
    }
    
//    for(int i=0;i<num;i++){
//        printf("%s ",names[i]);
//    }
//    
    
    int j;
    //排序学生名字
    for(i=0;i<num-1;i++){
        
        for(j=i;j<num;j++){
            
            if(strcmp(names[i],names[j])>0){
                strcpy(temp,names[i]);
                strcpy(names[i],names[j]);
                strcpy(names[j],temp);
            }
        }
    }
    
    //打印结果 
    printf("预期输出:"); 
    for(int i=0;i<num;i++){
        printf("%s ",names[i]);
    }
    
    return 0;
    
} 

img

供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
    int  i = 0, n, j;
    char *arr[N], tmp[64];
    scanf("%d", &n);
    while (i < n){
         scanf("%s", tmp);
         arr[i] = (char*)malloc(sizeof(char) * strlen(tmp)+1);
         strcpy(arr[i],tmp);
         i++;
    }
    for (i = 0;i < n - 1;i++){
        for (j = 0;j < n - 1 - i;j++){
             if (strcmp(arr[j],arr[j+1])>0){
                 strcpy(tmp,arr[j]);
                 strcpy(arr[j],arr[j+1]);
                 strcpy(arr[j+1],tmp);
             }
        }
    }
    for (i = 0;i < n;i++)
        printf(i == 0 ? "%s" : " %s",arr[i]);
    return 0;
}