该程序采用一个整数值,然后确定可以输入的字符串数量,一旦用户输入了他们指定的字符串数量,他们可以输入另一个整数,然后输入这些字符串数量。完成后,程序会根据长度的降序对字符串进行排序。但是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");
}
}
答案 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()
。