【发布时间】:2014-11-20 15:23:37
【问题描述】:
我正在尝试制作具有相同参数的 qsort 类型的函数。我还写了 3 个函数来比较 int、float 和 characters。由于某种原因,它在任何情况下都不起作用。 我不知道这是否是我的 qsortx 函数的问题,但我检查了几次,它应该可以正常工作。我不确定问题是什么,或者我做错了什么。我目前正在学习函数指针,我可能没有得到与它相关的所有内容。提前致谢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void qsortx(void*, int, int, int (*)(const void*, const void*));
int intcmp();
int floatcmp();
int charcmp();
int main()
{
int i,n;
char items[]={'c', 'a', 'b'};
n = 3;
for (i=0;i<n;++i) {
printf("%c ", items[i]);
}
printf("\n");
qsortx(items, n, sizeof(char), charcmp);
for (i=0;i<n;++i) {
printf("%c ", items[i]);
}
printf("\n");
return 0;
}
void qsortx (void *tp, int length, int pace, int(*fp)(const void* a, const void* b)) {
int switched,i,j;
void *p;
p=(void*)malloc(pace);
switched = 1;
while (1) {
if (switched == 0) {
return;
}
switched = 0;
for (i=0; i<length-1;++i) {
for (j=0;j<length-1;++j) {
printf("%c %c", tp+i, tp+j);
if (fp(tp+i, tp+j) > 0) {
memcpy(p, tp+i, pace);
memcpy(tp+i, tp+j, pace);
memcpy(tp+j, p, pace);
switched++;
}
}
}
}
}
int intcmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int floatcmp(const void* a, const void* b) {
return *(float*)a - *(float*)b;
}
int charcmp(const void* a, const void* b) {
return *(char*)a - *(char*)b;
}
【问题讨论】:
-
您能否添加一个无法按预期工作的示例?
-
如果你从上面运行代码,它会写出相同的数组,它不会像它应该的那样按升序更改项目:a b c。此外,有时它不会写出第一个字符,如果我在数组中使用 5 个元素在 int 上对其进行测试,那么前两个数字将是大数字或零。
-
我立即看到的一件事是 main 中的数组 items 是一个 int 数组,但你发送sizeof(char).
-
除了@Thomas 指出的大小问题之外,在您第一次通过
qsortx()中的循环时,您会在变量switched初始化之前检查它的值。 -
另外,
tp+i形式的表达式不正确。当被排序的项目的长度为 1 时,他们可能会偶然地做正确的事情,否则不会。