2016-06-12 82 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define N 20 

int compare(const void* a, const void* b) { 
    return strlen((char*)a) - strlen((char*)b); 
} 

int main() { 
    int i, n; 
    scanf("%d", &n); 
    char** strings = malloc(n*sizeof(char*)); 
    for(i=0; i<n;i++) { 
     strings[i]=(char*)malloc(sizeof(char*)); 
     scanf("%s", strings[i]); 
    } 
    qsort(strings, n, sizeof(char*), compare); 
    for(i=0; i<n;i++) 
     printf("%s\n", strings[i]); 
    for(i=0; i<n;i++) 
     free(strings[i]); 
    free(strings); 
    return 0; 
} 

因此,我試圖這樣做,但它返回一個unsorted數組,我不知道應該改變什麼,任何人都知道如何做到這一點?按字符串長度動態分配的動態分配的字符串的Qsort


[更新from comment:]

我忘了提及,應該通過串的長度進行排序。

+2

'字符串[我] =(的char *)malloc的(的sizeof(字符*));'應該是'字符串[我] = malloc(MaxLength);'左右。你的排序標準是什麼? – mch

+0

噢,我忘了提及,它應該按字符串的長度排序 – Nikola

+1

除了由mch提到的'malloc'問題,您的比較函數是無效的。 – melpomene

回答

0

C11 Standard (draft) on the qsort() function(由我重點):

陣列的內容被根據一個比較函數按升序排列指向COMPAR,其被稱爲具有兩個論點到被比較物體

顯示的代碼想要比較C-「字符串」,所以比較函數獲取指向C-「字符串」的指針,這些指針是char**(這裏)。

您的代碼對待參數作爲char *

要修正這種變化:

int compare(const void* a, const void* b) { 
    return strlen((char*)a) - strlen((char*)b); 
} 

爲:

int compare(const void * pv1, const void * pv2) { 
    char * ps1 = *(char **) pv1; 
    char * ps2 = *(char **) pv2; 

    return strlen(ps1) - strlen(ps2); 
} 

可選地(以避免石膏)做:

int compare(const void * pv1, const void * pv2) { 
    char ** ppc1 = pv1; 
    char ** ppc2 = pv2; 

    return strlen(*ppc1) - strlen(*ppc2); 
} 

注:上述兩個片段默默假定strings的元素是NULL


分配給char*時也分配大小,其中char*點,即*(char*),即char塊。

所以改變這樣的:

strings[i]=(char*)malloc(sizeof(char*)); 

是:

strings[i] = malloc(sizeof(char)); 
的甚至更好

(如sizeof (char)1是定義):這讓你

strings[i] = malloc(1); 

一個「字符串「的1 char只允許您存儲僅限空白字符串("")。

你可能想Nchars

所以做

strings[i] = malloc(N + 1); /* 1+ for the 0-terminator. */ 

注:在C沒有必要投malloc()(&友)的結果,也不是建議。


最後確保用戶在輸入過程中不會溢出目標變量。

所以,你想改變這個

scanf("%s", strings[i]); 

scanf("%20s", strings[i]); 
+0

這非常有幫助。非常感謝! – Nikola