2016-06-12 76 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