qsort()中cmp函数的一些使用方法(C语言)

作为个人的学习心得记录,写的不正确的地方欢迎指正啊!

一、基本形式

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 <string.h>
int cmp(const void *a ,const void *b)
{
	return strcmp( (char *)a , (char *)b );
}

例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 )
}

三、作为一个新手,极其欢迎大家补充!!!

  • 39
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值