问题描述
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int comp (const void *a,const void *b)
{
int *s1 = (int *)a;
int *s2 = (int *)b;
return (s1 - s2);
}
int main() {
int a[] = { 1,2,5,3 };
qsort(a,4,sizeof(a),comp);
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
printf("%d ",a[i]);
}
}
我使用 qsort()
对数组进行升序排序,但不幸的是,没有任何反应。数组元素保持在相同的位置。我尝试在调用 comp()
函数时打印消息,并且它被正确调用。问题是,元素没有改变。
可能是什么问题?
解决方法
您减去的是指针,而不是整数。推导指针以获取实际值。
这可能意味着按照您所说的执行 return (*s1 - *s2)
。然而,正如尤金·什。提到,这可能会溢出 int
。因此,比较*s1
和*s2
并相应地返回1
、-1
或0
。 Weather Vane 还提到您传递了错误的尺寸值。您应该分别将元素数量和每个元素的大小传递给第二个和第三个参数。
所以qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),comp);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int comp (const void * a,const void * b)
{
int *s1 = (int *)a;
int *s2 = (int *)b;
if(*s1 > *s2) {
return 1;
}
else if(*s1 == *s2) {
return 0;
}
else {
return -1;
}
}
int main() {
int a[] = {1,2,5,3};
qsort(a,comp);
for (int i = 0; i<sizeof(a)/sizeof(a[0]); i++) {
printf("%d ",a[i]);
}
}