【C语言指针超详解(五)】--回调函数,qsort函数的理解和使用,qsort函数的模拟实现
目录
一.回调函数
1.1--回调函数的概念
1.2--回调函数改造计算器程序
二.qsort函数的理解和使用
2.1--qsort函数的理解
2.2--使用qsort函数排序整型数据
2.3--使用qsort函数排序结构数据
三.qsort函数的模拟实现
🔥个人主页:@草莓熊Lotso的个人主页
🎬作者简介:C++研发方向学习者
📖个人专栏:《C语言》
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
一.回调函数
1.1--回调函数的概念
--回调函数就是一个通过函数指针调用函数。
int Add(int x, int y)//这里的Add就是回调函数
{return x + y;
}void test(int(*pf)(int, int))
{int r = pf(10, 20);printf("%d\n", r);
}int main()
{test(Add);return 0;
}
1.2--回调函数改造计算器程序
--在上篇文章中我们实现了计算器程序,我们发现了一般的实现方式代码重复度高,后面我们又用函数指针数组的方法优化了这个程序,今天我们使用回调函数的方式进行优化。
#include<stdio.h>int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}//函数的参数是函数指针,可以接收不同函数的地址
//接收的地址不同,调用的函数就不同
//这个函数根据参数的不同就能实现不同的功能
void calc(int(*pa)(int, int))
{int ret = 0;int x = 0;int y = 0;printf("即将进行运算,请输入操作数:");scanf("%d %d", &x, &y);ret = pa(x, y);printf("%d\n", ret);
}void menu()
{printf("****************************\n");printf("**1.Add 2.Sub**\n");printf("**3.Mul 4.Div**\n");printf("********* 0.exit *********\n");printf("****************************\n");
}int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(Add);break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf("已退出计算机程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}
我们可以把调用的函数的地址以参数形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是回调函数的功能 。
二.qsort函数的理解和使用
2.1--qsort函数的理解
--qsort函数是C语言中提供的一个排序函数(quick sort),是基于快速排序算法思想的一种排序算法。
qsort函数的优点:
- 现成的排序算法,学会了直接就可以使用,不需要自己实现了
- 大部分的情况下效率都是比冒泡排序高的
- qsort函数可以排序任意类型的数据
qsort函数的原型及其参数解析:
头文件 #include<stdlib.h>;
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_t size:每个数组元素的大小(以字节为单位)。这里有这个参数是因为,前面用的void*类型,只知道元素个数不知道每个元素多大是不行的。
- int (*compar)(const void *, const void *):一个指向比较函数的指针。该比较函数用于比较数组中的两个元素,它接受两个 const void * 类型的参数,返回值为 int 类型:
- 如果进行升序排序,返回一个正整数。
- 如果两个元素相等,返回0。
- 如果进行降序排序,返回一个负整数。
补充说明一下:默认第一个参数比第二个大;还有strcmp比较字符串的大小刚好和这里的比较函数的返回正负可以直接对上,在后面的使用中都会体现出来的。
2.2--使用qsort函数排序整型数据
--我们试着用qsort函数排序一下整型数据把(注意看注释)
#include<stdio.h>
#include<stdlib.h>
//qsort函数的使用者需要实现一个比较函数
//升序
int cmp_int1(const void* p1, const void* p2)
{return (*(int*)p1) - (*(int*)p2);//因为p1默认更大,所以p1在前减肯定返回正整数//void*类型无法直接进行指针运算,故强制类型转换为所需类型再进行运算
}
//降序
int cmp_int2(const void* p1, const void* p2)
{return (*(int*)p2) - (*(int*)p1);因为p2默认更小,所以p2在前减肯定返回负整数
}
void print(int arr[], int sz)
{int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[] = { 0,1,3,5,2,4,6,8,7,9 };int sz = sizeof(arr) / sizeof(arr[0]);printf("排序前:");print(arr, sz);qsort(arr, sz, sizeof(arr[0]), cmp_int1);printf("升序排序后:");print(arr, sz);qsort(arr, sz, sizeof(arr[0]), cmp_int2);printf("降序排序后:");print(arr, sz);
}
2.3--使用qsort函数排序结构数据
--我们再试试其它类型把,拿结构数据试试(注意看注释)
///结构体:年龄和名字一个按降序排,一个按升序排
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct mov
{char name[30];int age;
};//按年龄升序排
int cmp_byage(const void* p1, const void* p2)
{//return (*(struct mov*)p1).age - (*(struct mov*)p2).age;return (((struct mov*)p1)->age - ((struct mov*)p2)->age);
//上述两种形式都可以,一个不用解引用,一个需要,这里的—>操作符可以自行去了解一下
}
//按名字降序排
int cmp_byname(const void* p1, const void* p2)//名字是字符串所以需要用strcmp比较
{return strcmp(((struct mov*)p2)->name, ((struct mov*)p1)->name);
//p1默认比较大,按strcmp函数的比较规则,这里会返回负整数,刚好符合降序
}void print(struct mov arr[], int sz)
{int i = 0;for (i = 0;i < sz;i++){printf("%s:%d\n", arr[i].name,arr[i].age);}printf("\n");
}
int main()
{struct mov arr[] = { {"zhangsan",20},{"lisi",18},{"wangwu",19} };int sz = sizeof(arr) / sizeof(arr[0]);printf("排序前:");print(arr, sz);qsort(arr, sz, sizeof(arr[0]), cmp_byage);printf("按年龄升序排序后:");print(arr, sz);qsort(arr, sz, sizeof(arr[0]), cmp_byname);printf("按名字降序排序后:");print(arr, sz);
}
补充知识点
strcmp比较规则:
从两个字符串的首字符开始,逐个字符地进行比较,直到遇到不同的字符或者到达字符串的结束符'\0'。比较时,依据字符的ASCII码值来判断大小。
- 如果两个字符串完全相同,即对应位置的字符都相等,直到两个字符串都结束,则strcmp返回0。
- 如果在比较过程中,遇到第一个不相等的字符,且第一个字符串中该字符的ASCII码值大于第二个字符串中对应字符的ASCII码值,strcmp返回一个正整数。
- 如果在比较过程中,遇到第一个不相等的字符,且第一个字符串中该字符的ASCII码值小于第二个字符串中对应字符的ASCII码值,strcmp返回一个负整数。
三.qsort函数的模拟实现
--使用回调函数,模拟实现qsort(采用冒泡排序的方式),代码中还采用了void*类型,体会其用法。
#include<stdio.h>int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
void swap(char* p1, char* p2, int width)
{int i = 0;for (i = 0;i < width;i++)//虽然不知道每个元素的大小具体是多少,但是可以一个一个字节的交换,小于width就行{char temp = *(p1 + i);*(p1 + i) = *(p2 + i);*(p2 + i) = temp;}
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(void*, void*))
{int i = 0;for (i = 0;i < sz;i++){int j = 0;for (j = 0;j < sz - 1 - i;j++){//虽然不知道具体元素类型,但是强制转换为char*类型是因为是它的大小是1,再+j*size就可以找到第j个元素了if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0){swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}
void print(int arr[], int sz)
{int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[] = { 0,1,2,3,4,6,8,7,5,9};int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), int_cmp);print(arr, sz);
}
画图分析一下过程,这里int_cmp函数就是回调函数:
往期回顾:
【C语言指针超详解(一)】--指针变量和地址,指针变量类型的意义,指针运算
【C语言指针超详解(二)】--const修饰指针变量,野指针的辩析,assret断言,指针的使用和传址调用
【C语言指针超详解(三)】--数组名的理解,一维数组传参的本质,冒泡排序,二级指针,指针数组 【C语言指针超详解(四)】--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组,转移表
结语:本篇文章就到此结束了,继前面几篇文章后,在此篇文章中给大家分享了回调函数,qsort函数的理解和使用,qsort函数的模拟实现等知识点,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持,后续还会继续更新指针相关内容。
相关文章:
【C语言指针超详解(五)】--回调函数,qsort函数的理解和使用,qsort函数的模拟实现
目录 一.回调函数 1.1--回调函数的概念 1.2--回调函数改造计算器程序 二.qsort函数的理解和使用 2.1--qsort函数的理解 2.2--使用qsort函数排序整型数据 2.3--使用qsort函数排序结构数据 三.qsort函数的模拟实现 🔥个人主页:草莓熊Lotso的个人主…...
【Linux网络】————HTTP协议详解
作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2025年5月11日 1. HTTP 协议介绍 基本介绍: http协议全称:超文本传输协议,适用于从万维网服务器传输超文本到本地的传送协议。HTTP是一种应用层协议…...
使用WinSW工具将exe注册为window服务
下载工具WinSW(工具在GitHub上 打不开就需要魔法VPN) 文件准备 将以下文件放在同一个目录(例如:WebSocketService 文件夹)中: WebScoket.exe WinSW-x64.exe WebScoketService.xml ← 服务配置文件 install_service.bat ←…...
远程命令执行RCE概述
远程命令执行RCE诞生于1997年,比SQL注入早1年,据说当时的程序员发现在网站里可以随意的删除网页,就像删除本地文件一样简单,但是这种场景相对不多,因此没有SQL注入广泛,早期的web攻击像现在的护网一样&…...
在 .NET 8 开发的WinForms 程序中展示程序版本号的几种方式
前言 欢迎关注dotnet研习社,今天我们讨论一个Winform开发中的一个常见的需求内容“关于程序的版本号显示”。 在 WinForms 桌面应用程序开发中,向用户显示当前程序的版本号是一个常见的需求,尤其是在产品发布、更新提示或技术支持场景中尤为…...
[特殊字符] Spring Cloud 微服务项目中 common 模块依赖导致网关启动失败的排查与解决
在进行微服务开发时,我们通常会抽取一个 common 公共模块,封装一些通用配置类、工具类、拦截器、常用组件依赖等,供多个微服务共享使用。 但近期在实际开发中,出现了一个典型问题:在 Gateway 网关模块中引入 common 后…...
Java SpringMVC 和 MyBatis 整合关键配置详解
目录 一、数据源配置二、MyBatis 工厂配置三、Mapper 扫描配置四、SpringMVC 配置五、整合示例实体类Mapper 接口Mapper XML 文件Service 类控制器JSP 页面六、总结在 Java Web 开发中,SpringMVC 和 MyBatis 是两个常用框架。SpringMVC 负责 Web 层的请求处理和视图渲染,MyBa…...
24.(vue3.x+vite)引入组件并动态挂载(mount)
示例截图 组件代码: <template><div><div>{{message }}</div>...
Linux 软件包|服务管理
rpm 指令备注rpm -qa查看已安装软件,可以结合grep过滤查找rpm -e firefox卸载firefoxrpm -ivh firefox-115.12.0-1.el7.centos.i686.rpm安装gcc(只能离线安装) yum 能够从指定的服务器自动下载 RPM 包并且安装 指令备注yum list列出所有可…...
前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
前端实现本地文件上传与预览(PDF格式展示)不走后端接口 实现步骤 第一步:文件选择 使用前端原生input上传本地文件,或者是el-upload组件实现文件选择功能,核心在于文件渲染处理。(input只不过可以自定义样…...
TestNG接口自动化
第一章、 Rest assured接口测试框架 一、概述 接口自动化的框架,主要是用来做接口自动化测试,返回的报文都是JSON 语法比较简单,只需要掌握常用的方法 用例运行的速度非常快 断言的机制 Json 封装相关方法,jsonpath,x…...
Parasoft C++Test软件单元测试_实例讲解(指针类型的处理)
系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…...
ngx_http_keyval_module动态键值管理
一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块&am…...
面试篇:Spring MVC
基础概念 什么是Spring MVC? Spring MVC 是 Spring Framework 提供的一个基于 Servlet 的 Web 框架,属于 MVC(Model-View-Controller)架构的一种实现。它通过 DispatcherServlet 作为前端控制器,对请求进行分发和调度…...
C++初阶-string类的模拟实现3
目录 1.string::find(char ch,size_t pos0) const的模拟实现 2.string::find(const char* str,size_t pos0) const的模拟实现 3.string::size() const和string::capacity() const的模拟实现 4.string::operator[] (size_t pos)和string::operator[] (size_t pos) const的模拟…...
接口出现 请求参数格式错误 的解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理…...
MYSQL时间函数、group by 和partition by的区别、组内编号leetcode学习
mysql时间函数 select now(); --当前时间 select current_date() --当前日期 select current_timestamp --同now()select date(2025-04-14 12:34:56) --提取日期部分:2025-04-14 select datediff(2025-4-14,2025-04-10) 日期相差四天 select date_sub(2024-04-14,…...
OpenCV 的 CUDA 模块中用于将一个多通道 GpuMat 图像拆分成多个单通道图像的函数split()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::split 是 OpenCV CUDA 模块中的一个函数,用于将一个多通道的 GpuMat 图像拆分成多个单通道的 GpuMat 图像。这个函数是 CP…...
吴恩达机器学习笔记:单变量线性回归
通过一个例子来开始:这个例子是预测住房价格的,我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果房子是 1250 平方尺大小,你要告诉…...
UI自动化测试框架:PO 模式+数据驱动
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. PO 设计模式简介 什么是 PO 模式? PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成…...
NestJS 知识框架
一、核心概念 1. 架构基础 基于 Express/Fastify 的 Node.js 框架 采用模块化设计 使用 TypeScript 构建(也支持 JavaScript) 借鉴 Angular 的设计理念 2. 主要组件 模块 (Module): 应用的基本组织单元 控制器 (Controller): 处理 HTTP 请求 服务…...
Porting Linux to a new processor architecture, part 1: The basics
Although a simple port may count as little as 4000 lines of code—exactly 3,775 for the mmu-less Hitachi 8/300 recently reintroduced in Linux 4.2-rc1—getting the Linux kernel running on a new processor architecture is a difficult process. Worse still, the…...
Dagster Pipes系列-1:调用外部Python脚本
本文是"Dagster Pipes教程"的第一部分,介绍如何通过Dagster资产调用外部Python脚本并集成到数据管道中。首先,创建Dagster资产subprocess_asset,利用PipesSubprocessClient资源执行外部脚本external_code.py,实现跨进程…...
北京傲云源墅——区域价值腾飞的高端之选
在北京这座繁华都市中,房产的价值往往与区域的发展潜力息息相关。而傲云源墅项目,正位于极具价值的孙河墅区,这片土地正发生着令人瞩目的蝶变。近年来,孙河区域的崛起引人注目。2025 年 3 月,北京朝阳区平房乡黄杉木店…...
扩展:React 项目执行 yarn eject 后的 package.json 变化详解及参数解析
扩展:React 项目执行 yarn eject 后的 package.json 变化详解及参数解析 什么是 yarn eject?React 项目执行 yarn eject 后的 package.json 变化详解1. 脚本部分 Scripts 被替换2. 新增构建依赖 dependencies(部分)3. 新增 Babel …...
编写一个处理txt的loader插件,适用于wbepack
处理txt的webpack的loader插件 编写一个处理txt的loader插件,适用于wbepack 编写一个处理txt的loader插件,适用于wbepack 实现一个处理txt的插件,给文本每行前后添加**** module.exports function txtLoader(content) {// 确保 Loader 是异…...
高速边坡监测成本高?自动化如何用精准数据省预算?
高速边坡自动化监测解决方案 一、边坡监测的概述 1.1 边坡监测的背景 我国山地丘陵约占国土面积的65%,且地质地貌复杂,气候类型多样,构成活动频繁,自然灾害隐患多,分布广。而且近年来由于高速公路边坡滑坡灾害引发的事…...
SysAid On-Prem XML注入漏洞复现(CVE-2025-2776)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...
WEB安全--RCE--webshell bypass2
继WEB安全--RCE--webshell bypass的补充: 六、PHP反序列化 webshell: <?php $s unserialize(a:2:{i:0;O:8:"stdClass":1:{s:1:"a";i:1;}i:1;r:2;}); $c "123"; $arr get_declared_classes(); $i0;for($i;$i<c…...
Spark处理过程-转换算子和行动算子
(一)RDD的处理过程 RDD经过一系列的“转换”操作,每一次转换都会产生不同的RDD,以供给下一次“转换”操作使 用,直到最后一个RDD经过“行动”操作才会真正被计算处理。 1.延迟。RDD中所有的转换都是延迟的&…...
Spring Boot 配置文件敏感信息加密:Jasypt 实战
目录 1. 为什么需要加密配置文件? 2. Jasypt 快速集成 2.1 在xml文件中添加 Maven 依赖 2.2 生成加密字符串 编辑 编辑 3. 安全最佳实践 4. 常见问题 Q1:加密后启动报错? Q2&…...
c++STL-vector的模拟实现
cSTL-vector的模拟实现 vector的模拟实现基本信息构造函数析构函数返回容量(capacity)返回元素个数(size)扩容(reserve和resize)访问([])迭代器(**iterator**)…...
【Python 变量类型】
Python 是一种动态类型语言,变量类型在运行时自动确定,无需显式声明。以下是 Python 中核心变量类型的分类与用法详解: 一、基本数据类型 1. 数值类型 整数 (int) 支持正负数、零和二进制/八进制/十六进制表示: a 42 b 0o52 #…...
2.2 微积分的解释
第一阶段:曲直转化的数学革命 原始困境: 几何局限:古希腊几何仅能计算矩形/三角形等直线图形面积现实需求:17世纪弹道轨迹、行星轨道等曲线相关计算需求激增关键矛盾:直线数学工具(如毕达哥拉斯定理&…...
如何使用Selenium?
Selenium 是一个用于 Web 自动化测试 的开源工具套件,支持多种浏览器和编程语言。它最初是为测试 Web 应用而设计,但也被广泛用于 网页数据抓取 和 自动化操作。 Selenium 的核心组件 Selenium WebDriver 直接控制浏览器,模拟用户操作&…...
SVN 中文路径访问报错(权限已正确分配)
问题:SVN 中文路径访问报错(权限已正确分配) 原因: 1、URL特殊字符未转义 路径中包含空格、中文括号()等特殊符号,未进行URL编码 中文括号()示例:(设计)需转为%28%E8%AE%BE%E8%AE%A1%29,空格需…...
【Python 基础语法】
Python 基础语法是编程的基石,以下从核心要素到实用技巧进行系统梳理: 一、代码结构规范 缩进规则 使用4个空格缩进(PEP 8标准)缩进定义代码块(如函数、循环、条件语句) def greet(name):if name: # 正确缩…...
讲讲git 和svn
讲讲git 和svn 目录Git到底是什么?它该怎末用?核心概念基础操作1. 仓库的创建2. 文件的提交工作流程3. 分支管理4. 远程仓库操作 进阶操作实际应用建议**基本用法****常用命令的帮助示例****帮助文档的结构****替代方法****练习建议****核心概念****与Gi…...
运用数组和矩阵对数据进行存取和运算——NumPy模块 之四
目录 NumPy模块介绍 3.4 NumPy 数组重塑与转置 3.4.1 操作机制的理论逻辑 3.4.2 一维数组的重塑 3.4.3 多维数组的重塑 3.4.4 数组的转置操作 3.4.5 知识点总结与课程回顾 3.4.6 课后练习题 NumPy模块介绍 NumPy 是 Python 科学计算领域的重要基石,与当前 “躺吃旅行…...
机器学习第六讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列
机器学习第六讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:…...
服务器多JAR程序运行与管理指南
在同一台服务器上同时运行多个JAR程序是完全可以的,但需要注意以下几点以确保稳定性和性能: 关键注意事项 端口冲突 如果JAR程序是网络服务(如Web应用),确保每个程序监听不同的端口(例如:8080、…...
vue实现进度条带指针
效果最终 function calculatePointerPosition(value) {if (value < 2.6) return 12.5; // 非常差位置if (value < 5.1) return 37.5; // 较差位置if (value < 7.1) return 62.5; // 良好位置return 90; // 非常满意位置 }function getStatusText(value) {if (valu…...
【C++】智能指针
前言 上文我们学到了C11的异常,了解到了C与C语言处理错误的区别,异常的特点在于抛出与接收。【C11】异常-CSDN博客 本文我们来学习C中的下一个功能:智能指针 1.智能指针的使用场景 在上文我们知道了抛异常的知识,抛异常的“抛”这…...
Adobe Acrobat pro在一份PDF中插入空白页
在Adobe Acrobat pro中先打开我们的PDF文件; 用鼠标点击需要插入空白页处的上一页; 然后如下图操作: 默认会在光标处的下一页插入一张空白页,你也可以修改插入页的页码或者向前一页插入...
Oracle adg环境下调整redo日志组以及standby日志组大小
1.在adg环境中,调整redo日志组大小以及standby日志组大小主要思路如下: a、先备库增加standby redo 删除老standby redo, b、然后主库增加redo删除老redo, c、备库增加新redo删除老redo, d、最后主库增加standby redo。 #主库 [oracleDB196 ~]$ sql / a…...
Nlog适配达梦数据库进行日志插入
前言 原来使用的是SQLServer数据库,使用Nlog很流畅,没有什么问题。现在有个新项目需要使用麒麟操作系统和达梦数据库,业务流程开发完成之后发现Nlog配置文件中把数据库连接内容修改之后不能执行插入操作。 原Nlog.config配置 <?xml ve…...
记一次redis未授权被种挖矿
#挖矿程序 /etc/httpgd /etc/nnt.sh #大小问 #定时任务名为root /var/spool/cron/root 内容:*/50 * * * * sh /etc/nnt.sh >/dev/null 2>&1 定时任务只有所有者可以写,且chmod修改权限失败。 #先查看定时任务的拓展属性,不可变(i…...
Docker私有仓库实战:官方registry镜像实战应用
抱歉抱歉,离职后反而更忙了,拖了好久,从4月拖到现在,在学习企业级方案Harbor之前,我们先学习下官方方案registry,话不多说,详情见下文。 注意:下文省略了基本认证 TLS加密ÿ…...
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
LeetCode 热题 100_只出现一次的数字(96_136_简单_C) 题目描述:输入输出样例:题解:解题思路:思路一(哈希表):思路二(哈希集合):思路三…...
基于FastAPI框架的日志模块设计
以下是一个基于FastAPI框架设计的日志模块,结合SQLite数据库实现增删改查功能的完整实现方案: 1. 项目结构 your_project/ ├── app/ │ ├── logs/ # 日志模块目录 │ │ ├── models.py # 数据库模型定义 │ │ …...