编写一个书名排序程序,在主函数中输入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++]);
}

}