用函数void sort(char *name[],int n)实现他们的字符串字典顺序

编写一个书名排序程序,在主函数中输入n(n<=10)个书名存入一个二维数组,

用函数void sort(char *name[],int n)实现他们的字典顺序,
并用函数print(char *name[],int n)输出n个书名。

输入
第一行为整数n,后面n行是n个字符串表示的书名。

输出
排序后的书名,每行一个。

样例输入
5
Follow me
BASIC
Great Wall
FORTRAN
Computer
样例输出
BASIC
Computer
FORTRAN
Follow me
Great Wall


#include <stdio.h>
#include <string.h>
/* 二维数组传参的成功依赖于两部分:一是形参支持某种二维数组实参;二是实参的实质还要和形参相匹配. */
//void sort_string(char **string);

 void sort_string(char **string,int n)//作为形参:char **string 等价于 char *string[]
{
    /* 冒泡版 */
    int i=0,j=0;
    char buf[200];
    char *buf_p = string[0];
    /* 
    
    '*'切换到列指针(第i行的第零列地址):(*(string + i)) 
    (*(string + i) + j)第i行第j列的地址;
    *(*(string + i) + j)第i行第j列的元素.

    */
    /* 计数(遍历)字符串的数目n */
        /* 如果有必要对整个字符串进行比较,当然是用strcmp()函数,但
        如果比较第一个字符足以/或可以转化为比较其他属性(长度strlen()函数),则不必 */
    //for(n = 0;len != 0;n++);/* 原本打算再内部计算n(字符串个数) */

    /* 冒泡排序算法 */
    for(i = 0;i<n-1;i++)
    {
    //考虑列一个i_j排序区间部分 的枚举表格。https://img04.sogoucdn.com/app/a/100520146/79a03c31fdd4ef90a6329999fb8a9e99
        for(j=0;j<=n-2-i;j++)
        {
            /* 如果前者大于后者.交换位置使得最大者尽量靠后
            [min,max)型升序排列;随趟次增加,右界限往前缩小. 
            调转一成<号,就成了[max,min)型降序排列.*/
            if(strcmp(string[j],string[j+1]) > 0)
            //需要注意的是下标再这个模块了的j+1而不可出现相反的j-1,然而这容易不自主的写错
            {
                /* 调用strcpy(),可以使得字符串的排序和赋值项整数那样利索.
                但不够高效. */
                //strcpy(buf,string[j]);
                buf_p = string[j];//这是个指针变量作为右值,这时候,就将指针变量所保存的变量地址赋值给作为左值的指针
                //避免:warning: ISO C++ forbids converting a string constant to 'char*' 
                
                //strcpy(string[j],string[j+1]);
                string[j] = string[j+1];

                //strcpy(string[j+1],buf);
                string[j+1] = buf_p;
            }
        }
    }
} 

int main()
{
    //编一个字符串数组,并初始化
    //char *string[] = {"ad.txt","a1.txt","ac.txt","a5.txt"};

    /* string是指针数组名(同时指向第一个元素的地址(这里也就是第一个指针变量的地址,所以指针数组名也是给二级指针(同:&string[0])));
    string[i]是该数组(指针数组的第i个元素,每个元素都是指针变量(也是地址))(可以从普通数组的角度理解);
    &string[i]则是第i个元素的地址,相当于取指针变量的地址,即二级指针(地址) */

    //sort_string((char**)string);/* string:char (*)[20] 指向含 (有20个char类型的) 数组(的)指针变量*/
    //char*p[20] = string;
    int i=0,j=0;
    int n = 0;
    scanf("%d",&n);
    getchar();//新get的技能处理这第一个回车

    char buf[200];
    char read[20][20];
    char *string[20];
    /* 挂钩: */
    for(int i = 0;i < n;i++) 
    {
       // scanf("%s",read[i]);//无法处理字符串的空格
            //read[i](二维数组,列指针)
        
        gets(read[i]);
        string[i] = read[i];
    }
    /* 计数(遍历)字符串的数目n */
        /* 如果有必要对整个字符串进行比较,当然是用strcmp()函数,但
        如果比较第一个字符足以/或可以转化为比较其他属性(长度strlen()函数),则不必 */
        /* 处理的是无空洞字符串数组 */
    sort_string(string,n);
    for(int i = 0;i<n;)
    {
        printf("%s\n",string[i++]);
    }
    
}

posted @ 2023-03-15 13:15  xuchaoxin1375  阅读(36)  评论(0)    收藏  举报  来源