作为个人的学习心得记录,写的不正确的地方欢迎指正啊!
cmp作为一个比较函数,可以简单方便的对bsearch、qsort等函数提供交换依据。
它的基本形式为:
int cmp(const void *a ,const void *b);
可见:
1、cmp()会返回int型返回值;
2、cmp()带有两个指针型形式参数const void *
其中,const为一个限定词,含有const限定词的参数,尤其是以指针传递地址的参数,不会改变其原本的值。
void *,为一个无类型指针,既可以通过强制类型转换,使其转换为任意类型的指针,甚至直接取指向的数据值。
对于qsort中
int cmp(const void *a ,const void *b)
{
...
}
cmp()会有三种返回值(以qsort为例):
1、返回一个正数:a排列在b之后;
2、返回0:a、b相等;
3、返回一个负数:a排在b之前;
因此,我们可以由此得出一些基本的使用方法;
(一)对int数组升序排序
int cmp(const void *a ,const void *b)
{
return *(int *)a-*(int *)b;
}
(二)对double数组升序排序
以上方法对double型则不适用,因为cmp返回值为int型,若两个小数差距极小,例如:a=0.15 ,b=0.14,将会被强制转换为0返回,不发生交换
int cmp(const void * a,const void *b)
{
if( *( double* )a > *( double * )b )
return 1;
else if( *( double* )a < *( double * )b )
return -1;
return 0;
}
(三)对字符串按字典序排序
#include
int cmp(const void *a ,const void *b)
{
return strcmp( (char *)a , (char *)b );
}
例:
#include
#include
#include
int cmp(const void *a ,const void *b)
{
return strcmp( (char *)a , (char *)b );
}
int main()
{
char A[4][6]={
"abcde",
"aacde",
"accde",
"bcdef"
};
qsort(A,4,sizeof(A[0]),cmp);
for(int i=0 ; i<4 ; i++)
printf("%s\n",A[i]);
}
/*输出:
aacde
abcde
accde
bcdef
*/
(四)对结构体升序排序
typedef struct
{
int A;
double B;
char C[];
}Sructure;
int cmp(const void * a,const void *b)
{
//对int的引用
return (*(Sructure *)a).A-(*(Sructure *)a).B;
//对double的引用
if( (*( Sructure* )a).B > (*( Sructure* )b).B )
return 1;
else if( (*( Sructure* )a).B < (*( Sructure* )b).B )
return -1;
return 0;
//对字符串字典序排序
return strcmp( (*(Sructure *)a).C , (*(Sructure *)b).C )
}