我是使用qsort的新手,我正在尝试对预定义的双精度数组进行测试,遗憾的是,在使用qsort对数组进行排序后,我收到的结果全是0。我完全迷失了,任何建议都会非常感激。这是我用来对这个双打数组进行排序的代码。
static int compare (const void * a, const void * b){
if (*(const double*)a > *(const double*)b) return 1;
else if (*(const double*)a < *(const double*)b) return -1;
else return 0;
}
double stuff[] = {255, 1, 5, 39.0};
qsort(stuff, 4, sizeof(double), compare);
int i;
for(i = 0; i < 4; i++){
printf("%d %s", stuff[i], " ");
}
答案 0 :(得分:2)
您的问题是使用printf()
功能打印结果的方式。要打印double
值,您需要使用%f
,如下所示:
printf("%f ", stuff[i]);
另外,只是一个旁注:在比较函数中不需要这些else
语句,因为一旦条件被评估为true,它将返回函数。
答案 1 :(得分:1)
如前所述,问题出在您与printf()
一起使用的格式说明符中:%d
(您使用过的)不适合double
s;您应该使用%f
或%g
之类的内容。有关详细信息,请参阅this Q&A on StackOverflow。
类似的东西:
printf("%g ", stuff[i]);
应该没问题。
(请注意,您无需将"%s"
和单空格字符串文字传递给printf()
。)
此外,我想告诉你如何更好地编写compare()
函数:
您可以将原始void*
指针分配给函数体开头的某个常量值,以避免重复(丑陋)强制转换,并使代码更清晰,更易读。
您可能希望简化if...else if...else
结构,只使用更简单的if...return
结构。
这样的事情:
static int compare(const void * a, const void * b)
{
const double lhs = *(const double *)a;
const double rhs = *(const double *)b;
if (lhs > rhs)
return 1;
if (lhs < rhs)
return -1;
return 0;
}