/* 注解: 在處理字符串時, 我們通常使用一個指向包含那個字符串的緩沖區的指針, 如上圖, 應為指針要比長度大小可變的字符串自身更容易操縱 輸入完后: 對於這個程序理解, 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 ; }

這個程序的運行結果

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