大概问题是字符串传参 递归 递归还有点思路 但是传参和返回一团乱麻

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

大概问题是 输入几个字符串 通过递归的方式给这几个字符串按字典顺序排序
最让我头疼的是它程序里先是申请了一个二维字符数组 作为参数传给一个专门输入字符串的子函数 返回之后又申请了一个字符串指针数组也就是char*a[]然后把这个字符串指针数组传进递归比较的函数里


```c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char** change(char **a,int n){
    if(n==1)
    return a; //递归返回条件(存疑点1)(不确定是否正确)
    else{
        char*b;
        int i,j;
        for(i=0;i<n-2;i++){
            if(strcmp(a[i],a[i+1])>0)  //找出整组字符串里最大的一个
            j=i;
        }
        b=a[n-1];
        strcpy(a[n-1],a[j]);  //把最大的字符串放到末尾
        strcpy(a[j],b);
        change(a,n-1); //再传入字符指针数组变短
    }
}
char** input(char **a,int n){
    int i;
    for(i=0;i<n;i++){  //(存疑点2)gets不知道对不对 也不知道用不用getchar()
        scanf("%s",a[i]);
    }
    return a;
}
int main(){
    int n;
    scanf("%d",&n);
    char**m;  //二维数组
    m=(char**)malloc(sizeof(char*)*n);  //动态申请空间
    int i,j,k;
    for(i=0;i<n;i++){
        m[i]=(char*)malloc(sizeof(char)*100);
    }
    m=input(m,n);
    char**a;
    a=(char**)malloc(sizeof(char*)*n);//字符串指针数组
    for(i=0;i<n;i++){  //不知道怎样把二维数组传进字符串指针数组
        a[i]=&m[i][100];
    }
    a=change(a,n); //完全不知道该怎么用
    for(i=0;i<n;i++){
        puts(m[i]);
    }
}


运行结果及报错内容

它运行不出东西

我的解答思路和尝试过的方法

传参和返回值 还有那个二维数组和字符串指针数组我完全不知道怎么用

我想要达到的结果

img


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void change(char **a,int n) {
    if(n==1)
        return ; //递归返回条件(存疑点1)(不确定是否正确)
    else {
        char*b;
        int i,j;
        for(i=0; i<n-2; i++) {
            if(strcmp(a[i],a[i+1])>0)  //找出整组字符串里最大的一个
                j=i;
        }
        b=a[n-1];
        strcpy(a[n-1],a[j]);  //把最大的字符串放到末尾
        strcpy(a[j],b);
        change(a,n-1); //再传入字符指针数组变短
    }
}
void input(char **a,int n) {
    int i;
    for(i=0; i<n; i++) { //(存疑点2)gets不知道对不对 也不知道用不用getchar()
        scanf("%s",a[i]);
    }
    //return a;
}
int main() {
    int n;
    scanf("%d",&n);
    char**m;  //二维数组
    m=(char**)malloc(sizeof(char*)*n);  //动态申请空间
    int i,j,k;
    for(i=0; i<n; i++) {
        m[i]=(char*)malloc(sizeof(char)*100);
    }
    input(m,n);
    change(m,n);
   /* char**a;
    a=(char**)malloc(sizeof(char*)*n);//字符串指针数组
    for(i=0; i<n; i++) { //不知道怎样把二维数组传进字符串指针数组
        a[i]=&m[i][100];
    }*/
   // a=change(a,n); //完全不知道该怎么用
    for(i=0; i<n; i++) {
        puts(m[i]);
    }
}


img


不知道是不是我编译器的问题 还是出不来


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void change(char **a,int n) {
    if(n==1); //递归返回条件(存疑点1)(不确定是否正确)
    else {
        char*b;
        int i,j;
        for(i=0; i<n-2; i++) {
            if(strcmp(a[i],a[i+1])>0)  //找出整组字符串里最大的一个
                j=i;
        }
        b=a[n-1];
        strcpy(a[n-1],a[j]);  //把最大的字符串放到末尾
        strcpy(a[j],b);
        change(a,n-1); //再传入字符指针数组变短
    }
}
void input(char **a,int n) {
    int i;
    for(i=0; i<n; i++) { //(存疑点2)gets不知道对不对 也不知道用不用getchar()
        gets(a[i]);
    }
    //return a;
}
int main() {
    int n;
    scanf("%d",&n);
    char**m;  //二维数组
    m=(char**)malloc(sizeof(char*)*n);  //动态申请空间
    int i,j,k;
    for(i=0; i<n; i++) {
        m[i]=(char*)malloc(sizeof(char)*100);
    }
    input(m,n);
    change(m,n);
   /* char**a;
    a=(char**)malloc(sizeof(char*)*n);//字符串指针数组
    for(i=0; i<n; i++) { //不知道怎样把二维数组传进字符串指针数组
        a[i]=&m[i][100];
    }*/
   // a=change(a,n); //完全不知道该怎么用
    for(i=0; i<n; i++) {
        printf("%s",m[i]);
    }
    return 0;
}

非常非常感谢您的帮助
然后我还是想问问那个字符指针数组怎么用 我们学校考试他考这个东西。。