天天看點

用函數void sort(char *name[],int n)實作他們的字元串字典順序

編寫一個書名排序程式,在主函數中輸入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++]);
    }
    
}