C语言bsearch函数

news2024/11/14 22:51:09

目录

  • 开头
  • 1.什么是``bsearch``函数
  • 2.``bsearch``函数的第五个参数的写法
  • 3.``bsearch``函数的实际运用
    • 有序数组查询
    • 有序字符串查询
    • 有序二维字符串数组查询
  • 结尾

开头

大家好,我叫这是我58。今天,我们来学一下关于C语言里的bsearch函数的一些知识。

1.什么是bsearch函数

bsearch函数,来自于stdlib.h头文件,也叫binary search函数(二分查找函数)就是一个用二分查找法来查询要查询的有序数组中的某一个要查找的元素的函数,bsearch函数有5个参数,分别是const void* key, const void* base, size_t num, size_t sizeint (*compar)(const void*,const void*),这五个参数分别代表了:要查询的元素的指针(需强制转换成void*类型),从哪个有序数组查询,要查询的有序数组的元素个数,要查询的有序数组的每个元素的大小和判断检测到的元素是否为查找的元素的方法。而在bsearch函数的第五个参数中,如果返回<0的值,那么这个参数就是在告诉bsearch函数解引用之后的要查询的元素的指针比要查询的有序数组的某一个元素小了,否则如果返回>0的值,那么这个参数就是在告诉bsearch函数解引用之后的要查询的元素的指针比要查询的有序数组的某一个元素大了,如果既不返回<0的值又不返回>0的值,那这个参数就是在告诉找到解引用之后的要查询的元素的指针在要查询的有序数组的那个位置了,也就是说,bsearch函数解引用之后的要查询的元素的指针就是等于要查询的有序数组的某一个元素了。而这个bsearch函数,如果解引用之后的要查询的元素的指针等于要查询的有序数组的其中一个元素,就返回类型为void*的指向已经查询好的数组中与要查询的元素的指针匹配的条目的指针,如果有一个以上的匹配元素(即bsearch函数的第五个参数会输出一个以上的0),bsearch函数就可能返回指向其中任何一个与要查询的元素的指针匹配的条目的指针(不一定是第一个与要查询的元素的指针匹配的条目的指针)。否则如果查询好的有序数组的每一个元素都不等于解引用之后的要查询的元素的指针,那么bsearch函数就输出NULL1那么,为什么bsearch函数的第一,第二个参数的类型和第五个参数(第五个参数为函数)的所有参数的类型都是const void*呢?其实啊,这样做既是为了增加这个bsearch函数的健壮性(鲁棒性),又是让这个函数什么类型的数据都能查找呢!那么,bsearch函数的第五个参数可以怎样写呢?想知道的话,就看看下面的内容吧。

2.bsearch函数的第五个参数的写法

如果要从类型为char有序的字符数组(字符串)查找你想要的字符元素到底在不在,那么bsearch函数的第五个参数可以这样写:

int chrcmp(const void* vp,const void* vpa) {
	return *(char*)vp - *(char*)vpa;
}
int chrcmp(const void* vp, const void* vpa) {
	return *(char*)vpa - *(char*)vp;
}
int chrcmp(const void* vp, const void* vpa) {
	return -(*(char*)vp - *(char*)vpa);
}

在上面的第一个函数中,先把void*类型的指针vpvpa强制转换成了char*类型的指针,然后再把这些强制转换成了char*类型的指针解引用一下,最后返回解引用之后的字符指针vp减去解引用之后的字符指针vpa的值。而第二个函数就是在第一个函数的基础上把返回值的被减数换成了解引用并被强制转换成char*类型之后的vpa,而返回值的减数则换成了解引用并被强制转换成char*类型之后的vp,而第三个函数则是返回了第一个函数的返回值的相反数了。因此,这三个函数的返回值以表格的形式可以这样写。

从这个表格中,我们可以看到如果0==*(char*)vp - *(char*)vpa,那么这三个函数都返回0,因此,不管怎么样,这三个函数最终都会正常地找到或者没找到要查询的元素。


而如果要从类型为char的二维字符数组查找你想要的字符串元素到底在不在,那么在你导入string.h头文件之后,bsearch函数的第五个参数就可以是strcmp函数的地址了,因为strcmp函数与bsearch函数的第五个参数的返回值是一模一样的。因此,bsearch函数的第五个参数就可以是strcmp函数的地址了。

3.bsearch函数的实际运用

有序数组查询

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int intcmp(const void* vp, const void* vpa) {
	return *(int*)vpa - *(int*)vp;
}
int main() {
	int arr[10] = {1,42,3,5,7,342,54,43,3,3332};
	int i = 0;
	printf("请输入你要查询的数字 -> ");
	scanf("%d", &i);
	qsort(arr, 10, 4, intcmp);
	int* ip = ((int*)(bsearch((void*)(&i), arr, 10, 4, intcmp)));
	ip && printf("“%d”在这个有序的arr数组里", *ip), ip || printf("“%d”不在这个有序的arr数组里",i);
	return 0;
}

有序字符串查询

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int chrcmp(const void* vp, const void* vpa) {
	return *(char*)vp - *(char*)vpa;
}
int main() {
	char str[11] = "hfu3jkdue-";
	char ch = 0;
	printf("请输入你要查询的字符 -> ");
	scanf("%c", &ch);
	qsort(str, 11, 1, chrcmp);
	char* cp = ((char*)(bsearch((void*)(&ch), str, 11, 1, chrcmp)));
	cp && printf("“%c”在这个有序的str字符串里", *cp), cp || printf("“%c”不在这个有序的str字符串里",ch);
	return 0;
}

有序二维字符串数组查询

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
	char str[10][11] = { "fagsfdrefd","454fv41ddd","64vfd7#$%)","&&&%%gbdla",";;;;;h;h;o","qgsdjeh52g","alalalalal","jfhryf5555","jndhejbrfd","jfgrjhzvas" };
	char stra[11] = "";
	printf("请输入你要查询的字符串 -> ");
	scanf("%s", stra);
	qsort(str, 10, 11, strcmp);
	char* cp = ((char*)bsearch((void*)(&stra), str, 10, 11, strcmp));
	cp && printf("“%s”这个字符串在这个有序的str二维数组里", cp), cp || printf("“%s”这个字符串不在这个有序的str二维数组里",stra);
	return 0;
}

结尾

在你看到这里之后,可以评论来互动一下我哦。


  1. 选自C语言中的bsearch函数的简介 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu系统中下载安装Checkmk,搭建网络监控系统

文章目录 checkmk是什么&#xff1f;下载安装checkmkUbuntu系统安装选择checkmk版本下载checkmk安装checkmk检查checkmk版本创建checkmk站点启动checkmk及站点 推荐阅读 checkmk是什么&#xff1f; Checkmk 是一款开源的、可扩展的、企业级的网络监控工具。Checkmk提供了丰富的…

unity2D游戏开发14漫游

漫游算法 让敌人在地图上漫游,发现玩家在附加,就会追击,直到玩家逃跑或者杀死玩家 将Enemy预购件拖进场景,并将实例EnemyObject添加CircleCollider2D,选中Is Trigger复选框 创建漫游脚本 选中EnemyObject,点击Animation,右击enemy-idle-1,选择Set as Layer Default St…

发现编程新乐趣,20个Python小游戏源码宝藏,快来挖掘属于你的惊喜!(附源码)

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…

Node.js(5)——包

包 包的概念&#xff1a;将模块&#xff0c;代码&#xff0c;其他资料聚合成一个文件夹 分类&#xff1a; 项目包&#xff1a;主要用于编写项目和业务逻辑 软件包&#xff1a;封装根据和方法进行使用 要求&#xff1a;根目录中&#xff0c;必须有package.json文件&#xff08…

美林数据Tempo Talents | 两大资源中心,打造开放、成长型数智人才能力平台

在数字化时代的大潮中&#xff0c;高校作为知识与人才培养的重要阵地&#xff0c;独立分散的课程资源管理方式已无法满足现代教育的需求&#xff0c;而数据资源的分散和碎片化也阻碍了科研和教学工作的深入进行。那么&#xff0c;高校如何打造一个集中、高效的课程与数据资源中…

C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享

场景 作为一名C#的Winform开发者&#xff0c;势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。 当经历过几年企业级开发的磨炼&#xff0c;再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。 作为一名终身学习的信奉者&#xff0c;秉承Java体系需持续…

安卓手机数据恢复技巧之5个方法指南, 帮你吃上一次后悔药!

倘若您不慎于 Android 设备里删掉了宝贵的照片、视频以及文件&#xff0c;其后果恐怕难以承受。不过无需忧虑&#xff01;您能够在这篇极具价值的文章中探寻 5 款免费的 Android 数据恢复软件与应用程序。我们会阐述每一种工具最为令人称奇的功能以及其优劣势所在。在读完这篇全…

CSS学习 01 利用鼠标悬停制造文本隐藏效果

效果&#xff1a; 在正常状态下&#xff0c;剧透内容的背景色和文本颜色都是黑色&#xff0c;导致剧透内容看起来是隐藏的&#xff08;黑色文本在黑色背景上不可见&#xff09;。当鼠标悬停在剧透内容上时&#xff0c;背景色和文本颜色恢复为初始值&#xff0c;使得剧透内容可…

react-native 从入门到实战系列教程一底部导航及页面切换

react-native 里面的导航有点繁琐&#xff0c;需要引入 react-navigation 这个库。也是官网推荐的。整个过程不难&#xff0c;就是配置比较繁琐&#xff0c;还会因为网络的原因&#xff0c;时常报错&#xff0c;需要多试几次。排查错误&#xff0c;需要多看文档。安装完依赖&am…

Java同城信息付费系统对接微信广告系统小程序源码

解锁同城新商机&#xff01;同城信息付费系统如何高效对接微信广告 &#x1f680; 引言&#xff1a;同城信息付费的新纪元 在这个信息爆炸的时代&#xff0c;同城信息服务平台如雨后春笋般涌现&#xff0c;为用户提供了便捷的生活服务入口。然而&#xff0c;如何在众多平台中…

8月1日SpringBoot学习笔记

今天内容:配置maven 搭建springboot项目 约定大于配置 IOC DI 常用注解 springbean的作用域 springbean的生命周期 Springboot 创建springboot项目 maven项目添加springboot变成的springboot项目 具体步骤参考&#xff1a;http://t.csdnimg.cn/2NTuK与http://t.…

matlab y=sin(x) - 2/π*(x)函数绘制

[TOC](matlab ysin(x) - 2/π*(x)函数绘制) ysin(x) - 2/π*(x) clc; clear; close all; x_axis_length 10; y_axis_length 10; % 创建 x 值向量 x_positive linspace(0.1, 10, 1000); % 正半轴上的 x 值 x_negative linspace(-10, -0.1, 1000); % 负半轴上的 x 值% 计算…

从数学角度理解SVM分类算法

再谈间隔最大化 我们知道&#xff0c;支持向量机是以“间隔”作为损失函数的&#xff0c;支持向量机的学习过程就是使得间隔最大化的过程&#xff0c;若想要了解支持向量机的运转机制&#xff0c;首先就得知道间隔怎么计算。 “间隔大小”是由距离分类“界限”最近的两个数据点…

《计算机网络》(第8版)第1章 概述 复习笔记

第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能&#xff1a; 1 &#xff0e;连通性 指互联网上的用户之间是相互连通的。 2 &#xff0e;共享&#xff08;资源共享&#xff09; 资源共享可以是信息共享、软件共享&#xff0c;也可以是硬件共享。此…

Meta新功能生成式AI意味着什么

去年&#xff0c;Meta 推出了 AI 功能&#xff0c;允许广告主创建动态背景、增强图像并生成源自其原始内容的各种广告文本版本。这主要是侧重于通过测试图片和文本等创意元素来优化广告效果。在最新的更新中&#xff0c;Meta 带来了全新的 AI 生成功能&#xff0c;允许广告主依…

Java高级工程师教你解决内存泄漏生产事故方法案例实战

Java高级工程师教你解决内存泄漏宕机生产事故案例实战 一、事故简述与核心日志分析 生产WEB项目&#xff0c;每隔一段时间就宕机了&#xff0c;没有反应&#xff0c;JAVA进程还在&#xff0c;但是请求都没有反应&#xff01; 二、日志分析 org.springframework.web.util.Ne…

jeecg-boot框架activiti定时节点流转错误分析

文章目录 一、项目介绍二、问题复现三、排查过程1、找到报错信息2、找到报错的堆栈信息3.找到错误代码4.分析错误原因4.1、首先要明白SecurityManager是什么&#xff1f;4.2、定时器前的流程跟之前的流程不是同一个流程&#x1f449;定时任务的数据已经生成&#xff0c;那么该如…

Moretl 日志采集 使用说明

永久免费: Gitee下载最新版本 使用咨询: 扫码添加QQ 1: 服务器 部署Moretl文件采集服务.(管理员身份运行) 2. 在<设备电脑>打开 [部署页面],下载 [Client.zip].解压打开[Start.exe] 步骤3: [部署页面]输入远程Token.看到刚刚部署的设备电脑. 3.1 点击[明细],修改[…

Java Excel复杂表头,表头合并单元格

Java Excel复杂表头&#xff0c;表头合并单元格 效果预览 一、maven依赖 <!--操作excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version><scope>test</…

Sqlserver查询链接服务器数据问题,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…