[急]:高手们:关于qsort()的一个小问题!

oldjackyone 2003-10-16 01:40:12
int compare(const void* a, const void* b);

char* list[5]={"cattle","car","cabet","cap","canon"};

void main()
{
qsort((void*)list,5,sizeof(list[0]),compare);

for(int i=0; i<5; i++)
cout <<list[i] <<endl;
}

int compare(const void* a, const void* b)
{
return strcmp(*(char**)a, *(char**)b);
}

请问:
1.没有看到a与b的初值,有点不明白,这样可以比较大小,是依什么来比较的,请说明白一点好吗?
2.最后一个参数是如何工作的.
3.如果我把
int compare(const void* a, const void* b)
{
return strcmp(*(char**)a, *(char**)b);
//改成:return strcmp((char*)a, (char*)b);就不能进行排序,我不明白是如何工作的?
}
4.int compare(const void* a, const void* b)这个函数是返回一个整型值,如果我在qsort()最后一个参数加入整型数据就出错。

请高手们帮帮忙!谢谢!

如果可以话,请留下你们的QQ或MSN,交个朋友!感激!
...全文
43 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
arfi 2003-10-17
  • 打赏
  • 举报
回复
1. 使用下面的函数可以实现排序,不过用的方法是冒泡排序而不是快速排序,但原理应该一样。
void my_sort( void *base, size_t num, size_t width, int (__cdecl *comp )(const void *elem1, const void *elem2 ) )
{
int i, j;
char *buf, *begin;

begin = (char *)base;
buf = (char *)malloc(width);
if(buf == NULL)
return;

for(i=0; i<(int)num-1; i++)
{
for(j=num-1; j>i; j--)
{
if(comp(begin+(j-1)*width, begin+j*width) > 0)
{
memcpy(buf, begin+(j-1)*width, width);
memcpy(begin+(j-1)*width, begin+j*width, width);
memcpy(begin+j*width, buf, width);
}
}
}

free(buf);
}

这样的话,参数a和b应该值的是数组list中某个元素的地址。

2. 参照上面函数,以函数指针的形式调用用户自己定义的一个函数。

3. 考虑一下将return strcmp(*(char**)a, *(char**)b);
改成:return strcmp((char*)a, (char*)b);后,a与b为指针数组list中的元素的地址,这样比较的话是将这些地址值看成字符串进行比较。

4. 因为qsort中需要调用用户给定的函数指针。所以你要写成qsort((void*)list,5,sizeof(list[0]),1);的形式肯定回报错的。


而对于ccwwbb(兵兵)的程序给出的list是个二维数组,此时参数a,b表示的就是字符串的地址。而对于指针数组来说a,b表示的是存储字符串地址的list元素的地址。如果还不太清楚,跟一下这个程序。

ccwwbb 2003-10-17
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int sort_function( const void *a, const void *b);
char list[5][4] = { "cat", "car", "cab", "cap", "can" };

int main(void)
{
int x;

qsort((void *)list, 5, sizeof(list[0]), sort_function);
for (x = 0; x < 5; x++)
printf("%s\n", list[x]);
return 0;
}

int sort_function( const void *a, const void *b)
{
return( strcmp((char *)a,(char *)b) );
}

而为什么以上程序又能正常运行呢?
我也关注!
roselu 2003-10-16
  • 打赏
  • 举报
回复
关注!
JetGeng 2003-10-16
  • 打赏
  • 举报
回复
应为a是一个void型的指针在使用前他需要转换转换成一个指向指针的指针,或者说他是一个指向一个以为数组的指针。那将它转换成一个一维数组的首地址,类型都错了肯定没法工作了。
return strcmp(*(char**)a, *(char**)b);
//改成:return strcmp((char*)a, (char*)b);就不能进行排序,我不明白是如何工作的?
zoohoo 2003-10-16
  • 打赏
  • 举报
回复
进行比较的参数实现上是char **类型的,对于具体的元素需要加指针如
*(char **)a第一个元素
*((char **)a + 1)第二个元素
否则是内存地址的比较,没有意义
devzhao 2003-10-16
  • 打赏
  • 举报
回复
1.没有看到a与b的初值,有点不明白,这样可以比较大小,是依什么来比较的,请说明白一点好吗?
看一下qsort的原型,就知道a,b的实参是什么了,
2、qsort最后一个参数是函数指针
3、再把指针好好学学
4、注意函数指针与函数的区分
yjh1982 2003-10-16
  • 打赏
  • 举报
回复
1,看msdn
2,是个函数指针

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧