編寫一個書名排序程式,在主函數中輸入n(n<=10)個書名存入一個二維數組,
用函數void sort(char *name[],int n)實作他們的字典順序,
并用函數print(char *name[],int n)輸出n個書名。
輸入
第一行為整數n,後面n行是n個字元串表示的書名。
#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++]);
}
}