使用qsort对字符串数组进行排序

时间:2017-03-02 13:46:33

标签: c arrays

该程序采用一个整数值,然后确定可以输入的字符串数量,一旦用户输入了他们指定的字符串数量,他们可以输入另一个整数,然后输入这些字符串数量。完成后,程序会根据长度的降序对字符串进行排序。但是qsort不起作用,它最终输出字符串最初输入时的顺序。

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


int sort(const void * a, const void * b){
    size_t fa = strlen((const char *)a);
    size_t fb = strlen((const char *)b);
    return (fa < fb) - (fa > fb);

}

int main(void){

char pointer[100];
int n;
scanf("%d", &n);
char** strings = malloc(n * sizeof(char*));

int i;
for (i = 0; i < n; i++){
    scanf("%s", pointer);
    strings[i] = malloc(sizeof(char) * (strlen(pointer) + 1));
    strcpy(strings[i], pointer);

}

int m;
scanf("%d", &m);
strings = realloc(strings, (n + m) * sizeof(char*));
for (i = n; i < m + n; i++){

    scanf("%s", pointer);
    strings[i] = malloc(sizeof(char) * (strlen(pointer) + 1));
    strcpy(strings[i], pointer);
}

int a;
int g;
int k = m + n;
qsort(strings , a, 100, sort);
for (g = 0; g < k; g++){
    printf("%s", strings[g]);

    printf("\n");


}
}

2 个答案:

答案 0 :(得分:1)

您根本没有正确调用qsort

第二个参数是&#34;数组&#34;中元素的数量。你正在整理。您目前正在传递a,正如其他人所指出的那样,它并未设置为任何内容。使用&#34; -Wall&#34;编译代码选项会显示这些错误。

第3个参数是&#34;数组&#34;中某个元素的大小,但是您将此与无关变量pointer的大小混淆了吗?您可以像sizeof(strings[0])一样编写它。

完成的通话应该看起来像qsort(strings,k,sizeof(strings[0]),sort);

但这仍然无法发挥作用,因为你的sort()函数正在传递两个指向你的&#34;数组的元素&#34; (char **)并且您将它们视为&#34;数组的两个元素&#34; (char *)。所以你想要像

这样的东西
size_t fa = strlen(*(char **)a);

答案 1 :(得分:0)

嗯,这个:

int a;
int g;
int k = m + n;
qsort(strings , a, 100, sort);

根本没有意义,a没有值,所以这是未定义的行为。

同样sort()已被破坏,它应该只是strcmp()