首页 > 其他分享 >回调函数和qsort,strcmp函数

回调函数和qsort,strcmp函数

时间:2024-08-02 14:24:43浏览次数:16  
标签:const 函数 int void qsort strcmp size

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

1.回调函数是什么?
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

我们拿qsort函数举个例子

qsort函数的类型是

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

void* base

指向要排序的数组的第一个对象的指针,将其转换为 .void*

size_t num

所指向的数组中的元素数。
是无符号整数类型。

size_t size 

数组中每个元素的大小(以字节为单位)。
是无符号整数类型。

int (*compar)(const void*,const void*)

指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素。它应遵循以下原型:

也就是我们要自己写一个函去作为比较标准

当p1指向的元素比p2大时返回一个大于0的值

当p1指向的元素比p2小时返回一个小于0的值

当p1指向的元素比p2相等时返回一个等于0的值

qsort默认排列的是升序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int comparation (const void*a, const void*b);
void print(void* c,int sz);
int main(void) {
	int arr[] = { 1,23,42,32,13312,2323,323,123 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comparation);
	print(arr,sz);
	return 0;
}
int comparation(const void*a, const void*b) {
	return (*(int*)a-*(int*)b);
}
void print(void* c,int sz) {
	for (int i = 0; i < sz; i++)
{ 
	printf("%d\n", *((int *)c + i));
}
}

如上图我们在使用qsort函数的时候我们需要写一个函数作为比较标准

这个标准我们可以自己写,比如把上面的return (*(int*)a-*(int*)b);改成return (*(int*)b-*(int*)a);

我们就可以把qsort变成一个排列降序的函数

但是这里需要注意qsort函数和我们自己编写的函数的类型是确定的,

qosrt函数类型必须是

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

我们自己写的比较原则的函数类型必须是int (*compar)(const void*,const void*)

但是这个地方的void*是为了方便我们接收不同类型的数据,但是void*的数据无法直接使用必须强制转换成其它类型才能使用。

那么思考一下,字符串如何比较呢?字符串可不能像整数类型一样直接比较(> < <= >= = !=都无效),因此这个地方我们必须调用一个用来比较字符串的函数strcmp

strcmp比较的不是字符串的长度而是对应字符的大小

strcmp函数的头文件是#include <string.h>

函数定义 :int strcmp(const char *str1, const char *str2);
这里的 const char* 表示两个参数 str1 和 str2 都是指向字符的指针,并且这些字符都以空字符'\0'结尾。(\0的ASCII码值是0)

函数功能 :
strcmp函数会从两个字符串的首地址开始,逐个比较它们对应位置的字符的ASCII码值,直到遇到不同的字符或者其中一个字符串结束。如果 str1 小于 str2 ,则函数返回一个负值;如果两个字符串相同,函数返回0;如果 str1 大于 str2 ,则函数返回一个正值。

回调函数本质上是在一个函数中调用宁外一个函数,如上面那段代码中,我们在qsort函数中调用了comparation这个函数,comparation就是回调函数。

标签:const,函数,int,void,qsort,strcmp,size
From: https://blog.csdn.net/Starry_tsx/article/details/140727305

相关文章

  • 人工智能深度学习系列—深度学习损失函数中的Focal Loss解析
    文章目录1.背景介绍2.Loss计算公式3.使用场景4.代码样例5.总结1.背景介绍在深度学习的目标检测任务中,类别不平衡问题一直是提升模型性能的拦路虎。FocalLoss损失函数应运而生,专为解决这一难题设计。本文将深入探讨FocalLoss的背景、计算方法、应用场景以及如......
  • [Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18338279出自【进步*于辰的博客】目录先言1、单行函数1.1lpad/rpad(str1,n,str2)1.2instr(str1,str2[,pos][,n])2、非空判断函数3、日期函数4、正则表达式相关函数4.1......
  • 微信小程序生命周期函数介绍
    微信小程序生命周期函数有两种   页面生命周期:onLoad,onShow,onReady,onHide,onUnload等   组件的生命周期:created,attached,ready,moved,detached,erroronLoad:监听页面加载一个页面只会调用一次,能够在onLoad中获取打开当前页面所调用的query参数     onLoad(options){......
  • 二维字符型数组和函数
    二维字符型数组chara[5][10]可以存储最大长度为为10的,5个字符串;按行初始化:a[5][10]={“hello”,“world“,“who”,“are”,“you”} chars[3][10]={{"hello"},{"world"},{"english"}};   gets(s[0]);//s[0]就是第0行这个一维字符型数组的数组名    sca......
  • 字符串相关函数、二维数组-
    目录strcpy--字符串复制函数strcat--字符串拼接函数strcmp--字符串对比函数字符串相关函数:二维数组初始化:strcpy--字符串复制函数char*strcpy(char*dest,constchar*src);功能:  将src中字符串拷贝到dest中 用法: strcpy(dest,src);//dest是一个字......
  • /*使用strchr(),strrchr(),strpdrk()函数*/
    /使用strchr(),strrchr(),strpdrk()函数/#include<stdio.h>#include<string.h>/使用strchr()函数:如果s字符串中包含c字符,该函数返回指向s字符串首次出现c字符的指针,未找到返回NULL/voidstr_chr(constchar*s,intc){if(strchr(s,c)!=NULL){printf......
  • Hive学习第九天--函数的用法
    1.1 Hive窗口函数普通的聚合函数每组(Groupby)只返回一个值,而开窗函数则可为窗口中的每行都返回一个值。简单理解,就是对查询的结果多出一列,这一列可以是聚合值,也可以是排序值。开窗函数一般就是说的是over()函数,其窗口是由一个OVER子句定义的多行记录开窗函数一般分为两......
  • 每天五分钟玩转深度学习框架PyTorch:选择函数where和gather
    本文重点如图表所示,这几个方法可以理解为索引函数,有些函数在切片和索引一章进行了简单的介绍,本文将再次进行介绍,温故知新。index_select通过特殊的索引来获取数据index_select,这个这样来理解,第一个参数表示a的第几维度,第二个参数表示获取该维度的哪部分。我们把16,3,28,28看......
  • 反函数与隐函数
    隐函数定理\(\bfTheorem\;1.\quad\)设\(\Omega\in\mathbbR^m\times\mathbbR^n\)为开集,\(\boldsymbolF(\boldsymbolx,\boldsymboly)\)(其中\(\boldsymbolx\in\mathbbR^m,\boldsymboly\in\mathbbR^n\))满足\(\boldsymbolF(\boldsymbolx,\bold......
  • 嵌入式软件--C语言高级 DAY 8 函数
    函数是C语言尤为重要的知识点,再嵌入式的学习过程中,对51和32的单片机的学习是重中之重。一、函数的基本概念1.介绍函数是一种可重复使用的代码块,用于执行特定的任务或操作。函数允许我们将代码逻辑组织成独立的单元,从而提高了代码的可读性、可维护性和重用性。一个C程序可......