算法:C語言實現 (3)字符串數組的排序


 

/*
注解: 在處理字符串時,  我們通常使用一個指向包含那個字符串的緩沖區的指針,  
        如上圖, 應為指針要比長度大小可變的字符串自身更容易操縱

輸入完后:  對於這個程序理解,
1. 首先定義了一個用於存儲字符串數組的  緩沖區字符串
2. a是個字符串指針類型的數組
3. a[N]表示了含有N個字符串的指針

如果這個文件后綴名寫為cpp, 那么編譯的時候會出錯,  因為CPP 和C的函數的壓棧順序不一樣, 所以
qsort( particles, n, sizeof( particle ), &cmp );這一行一直沒能編譯通過,報的錯誤是error C2664: “qsort” : 
不能將參數 4 從“int (const FILEINFO *,const FILEINFO *)”轉換為“int (__cdecl *)(const void *,const void *)”
還好能從網上找到答案,按照下面的格式定義cmp就可以在C++中運行了:int __cdecl cmp(const void* p1, const void* p2 ),
還有說法是將cmp定義成static類型也是可以

 __cdecl 是C DECLaration的縮寫(declaration,聲明),表示C語言默認的函數調用方法:所有參數從右到左依次入棧,這些參數由調用者清除,稱為手動清棧。
  _stdcall 是StandardCall的縮寫,是C++的標准調用方式:所有參數從右到左依次入棧,如果是調用類成員的話,最后一個入棧的是this指針。這些堆棧中的參數由被調
  用的函數在返回后清除,使用的指令是 retnX,X表示參數占用的字節數,CPU在ret之后自動彈出X個字節的堆棧空間。

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  Nmax 1000
#define  Mmax 10000

char buf[Mmax];
int M = 0;

int compare(void *i, void *j)
{
    return strcmp(*(char **)i, *(char **)j);
}

int main ()
{
    int i,N;
    char* a[Nmax];
    for (N = 0; N < Nmax; N++)
    {
        a[N] = &buf[M]; //將a[N]賦值為""(空的字符串), buf 是一個容量足夠大的字符串容器
        if (scanf("%s",a[N])== EOF)//這樣的輸入以后, 會默認在字符數組后面加上'\0'字符
            break;
        M += strlen(a[N])+1;//M統計了中的字符串數組中字符的個數, 而N表示了buf中具有的字符串的個數
    }

    qsort(a, N, sizeof(char *), compare);

    for (i=0; i < N; i++)
    {
        printf("%s\n",a[i]);
    }
    return 0 ;
}

 

 

 

這個程序的運行結果

 

注解: 在處理字符串時,  我們通常使用一個指向包含那個字符串的緩沖區的指針,  如上圖, 應為指針要比長度大小可變的字符串自身更容易操縱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM