在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(1)
人无完人,持之以恒,方能见真我!!!
共同进步!!
文章目录
- 一、字符分类函数
- 二、字符转换函数
- 三、strlen的使用和模拟实现
- 四、strcpy的使用和模拟实现
- 五、strcat的使用和模拟实现
- 六、strcmp的使用和模拟实现
一、字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
这些函数的使用方式十分类似,就拿一个来给大家举个栗子:
int islower ( int c );
islower 是能够判断参数部分的 c 是否是小写字母的,通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0
练习:写⼀个代码,将字符串中的小写字母转大写,其他字符不变,最后将其打印出来
分析:首先我们可以创建一个字符数组存放字符串,然后遍历数组,每一次都使用函数islower函数判断一下该字符是否是小写字母,如果是小写字母,那就给它-32,让它变成对应的大写字母,最后我们以%s的形式将数组打印出来即可(记得包含头文件ctype.h)
#include <stdio.h>
#include <ctype.h>int main()
{char arr[] = "Hello World!";int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz-1; i++){if (islower(arr[i])){arr[i] -= 32;}}printf("%s\n", arr);return 0;
}
二、字符转换函数
C语言提供了两个字符转换函数,要使用它们同样要包含头文件ctype.h:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
于是我们上面的那个将小写字母转换为大写字母的练习就可以这样写:
#include <stdio.h>
#include <ctype.h>int main()
{char arr[] = "Hello World!";int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz-1; i++){if (islower(arr[i])){toupper(arr[i]);}}printf("%s\n", arr);return 0;
}
三、strlen的使用和模拟实现
首先我们来学习学习 strlen 的原型:
size_t strlen ( const char * str );
strlen的特点如下:
- 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )
- 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为 size_t,是⽆符号的( 易错 )
- strlen的使⽤需要包含头⽂件string.h
知道如上strlen的特点后,我们来试着模拟实现一下strlen函数
- 函数命名:my_strlen
- 函数参数:直接照搬原函数strlen的参数,如下:
size_t my_strlen(const char* p)
- 函数实现:
(1)由于我们传递的是指针,为了防止NULL空指针的出现,我们可以在函数开头使用assert对str进行 断言,注意包含头文件assert.h
(2)然后我们可以使用递归的方式实现,当然我们还有其他的方法
(3)当*str 不等于’\0’, return 1 + my_strlen(str + 1),反之则返回 0
(4)最后在在主函数中用返回值判断即可
#include <assert.h>
//1.递归解法
size_t my_strlen(const char* str)
{assert(str);if (*str != NULL)return 1 + my_strlen(str + 1);elsereturn 0;}//2.指针首尾相减解法
size_t my_strlen(const char* str)
{assert(str);const char* start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "Hello World!";int sz = sizeof(arr) / sizeof(arr[0]);int ret = my_strlen(arr);printf("%d\n", ret);return 0;
}
四、strcpy的使用和模拟实现
函数strcpy的作用是拷贝字符串,比如我们要把一个数组中的字符串拷贝到另一个数组中,我们就会使用strcpy函数,使用它需要包含头文件string.h,接下来我们来看看函数strcpy的原型:
char* strcpy(char * destination, const char * source );
原型解析:strcpy的第一个参数是我们拷贝字符串的目的地的首地址,也就是接收拷贝的数组的首元素地址,第二个参数是我们拷贝字符串的源字符串的首地址,它的返回值就是接收拷贝的目标空间的初始地址
我们现在来看看它的特点:
- 源字符串必须以 ‘\0’ 结束
- 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间
- ⽬标空间必须⾜够⼤,以确保能存放源字符串
- ⽬标空间必须可修改
我们来使用一下它,看看怎么个事儿:
可以看到strcpy帮我们把数组arr2的字符串拷贝给了arr1
学会使用,以及了解了它的使用方法之后,我们来试着模拟实现一下strcpy:
- 函数命名:my_strcpy
- 函数参数:可以直接照抄strcpy原型的参数,这里返回char* 是首地址便于打印,参数如下:
char* my_strcpy(char* str1, const char* str2)
- 函数实现:
(1)由于接收的是两个指针参数,所以我们最好首先使用assert进行断言,以防NULL出现
(2)由于要返回目标空间的起始地址,所以我们还是创建一个start变量来存放刚开始的str1,最后用于返回
(3)strcpy函数的原理就是把源字符串的字符一个一个拷贝给目标字符串,所以我们可以使用while循环,对str2解引用,然后赋值给*str1,把这个赋值表达式作为循环判断条件,然后每执行一次就对str1和str2++一次,如果中途遇到赋值到\0,那么赋值表达式的结果为\0,自动停止循环如下:
while (*str1++ = *str2++)
{;
}
- 循环完成后,就代表拷贝完成,这时候返回start就可以进行打印了
#include <assert.h>char* my_strcpy(char* str1, const char* str2)
{assert(str1 && str2);char* start = str1;while (*str1++ = *str2++){;}return start;
}
运行结果:
五、strcat的使用和模拟实现
函数strcat的作用是追加字符串,把一个字符串追加到指定字符串的末尾,使用它要包含头文件string.h,接下来我们来看看strcat的原型
char * strcat ( char * destination, const char * source );
strcat函数原型:它的参数和strcpy类似,第一个参数是被追加的目的地的首地址,第二个参数是要追加的源数据的首地址,返回的也是被追加的目的地的首地址,这个库函数与上面的strcpy的结构十分相似
了解了它的原型后,我们来看看它的特点:
- 源字符串必须以 ‘\0’ 结束
- ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始
- ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容
- ⽬标空间必须可修改
我们来试着使用它,把字符串数组arr2的字符串追加到字符串数组arr1后:
随后我们来试试模拟实现一下strcat:
- 函数命名:my_strcat
- 函数参数:可以直接照抄strcat原型的参数,结构与上面相似,参数如下:
char* my_strcat(char* str1, const char* str2)
- 函数实现:
(1)还是老步骤,接收指针首先使用assert对它们断言一下
(2)strcat函数就是把源字符串放在目标字符串后面,我们就要思考一下是放在目标字符串的哪个字符的后面,是不是\0后面呢?很明显不是,因为如果是\0后面,在打印时会提前碰到目标字符串的\0,结束打印,而不会打印后面追加的内容
(3)所以可以得出,在追加时,strcat会从目标字符串的\0处开始追加,会覆盖目标字符串的\0,所以第一步我们就要先把str1移动到\0那个位置,还是可以使用我们的while循环,如下:
while (*str1)
{str1++;
}
(4)注意这里不能把循环条件写成str1++,因为如果str是\0了,循环是照常结束,但是str还要++一次,str就指向\0后面了,根据我们前面的分析就是错误的,所以这里只能把str自增的语句写在循环体内,当然,如果是拷贝字符串则不用担心这一点,可以放心把自增写在循环判断条件中
(5)然后我们继续分析,经过上面的循环,我们的str1指向的就是\0了,接着我们就把str2字符串完整的拷贝过来就可以了,这个拷贝的过程可以参考strcpy,可以把自增条件写在循环判断条件中,如下:
while (*str1++ = *str2++)
{;
}
- 函数代码
#include <assert.h>char* my_strcat(char* str1, const char* str2)
{assert(str1 && str2);char* start = str1;while (*str1){str1++;}while (*str1++ = *str2++){;}return start;
}
5.函数测试:如下图:
注:一个字符串不能使用strcat自己给自己追加
很明显失败了,这是为什么呢?原因在下一篇字符函数和字符串函数(2)中我们会讲到,要实现这个功能需要另一个函数strncat,到时候也会详细介绍以及实现这个函数,大家敬请期待!
六、strcmp的使用和模拟实现
strcmp的作用就是帮我们比较两个字符串的大小,那么比较的依据是什么呢?是字符的acsll码值,同样的,使用该函数要包含头文件string.h,我们来看看它的原型:
int strcmp ( const char * str1, const char * str2 );
原型解析:strcmp的两个参数分别是两个字符串的首字符地址,如果前一个字符串大于后一个字符串,返回一个大于0的数,如果相等就返回0,如果小于就返回一个小于0的数
接着我们来看看strcmp的特点:
- 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
- 第⼀个字符串等于第⼆个字符串,则返回0
- 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
- 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小
了解了这些之后,我们来尝试使用一下strcmp函数来比较两个字符串,技巧就是用一个变量接收strcmp的返回值,然后根据返回值来确定两个字符串的大小关系,如下:
现在我们来模拟实现一下strcmp:
- 函数命名:my_strcmp
- 函数参数:可以直接照抄strcmp原型的参数,如下:
int my_strcmp ( const char* str1, const char* str2 );
- 函数实现:
(1)老规矩,首先还是对两个指针变量断言一下
(2)我们可以用一个while循环,判断一下 *str1 和 *str2是否相等,如果相等就进入循环,然后对str1和str2进行++操作
(3)要注意的一点是,有可能它们两个字符串完全相等,我们可以判断一下 *str1是否 = \0,由于它们解引用后相等才会进入循环,所以此时 *str2 = \0,此时就说明两个字符串完全相等,直接返回0
(4)如果出了循环,说明它们当前指向的字符不相同,所以此时我们直接返回它们的差值即可,如果前一个字符更大,差值就自然大于0,符合函数的情况,后一个字符大也同理,这样我们就实现了我们的strcmp
函数代码:
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}
- 运行结果:
到这里,本篇博客也算是结尾了,希望大家收获多多,体悟多多,最后祝大家期末不挂科!!事业顺利!天天开心!!
相关文章:
在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(1)
人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和…...
【专题】存储器管理
1. 存储器的层次结构 在计算机执行时,几乎每一条指令都涉及对存储器的访问,因此要求对存储器的访问速度能跟得上处理机的运行速度。 存储器的速度必须非常快,能与处理机的速度相匹配,否则会明显地影响到处理机的运行。 此外还要求…...
python股票数据分析(Pandas)练习
需求: 使用pandas读取一个CSV文件,文件内容包括股票名称、价格和交易量。完成以下任务: 找出价格最高的股票; 计算总交易量; 绘制价格折线图。 代码实现: import pandas as pd import matplotlib.pyplot …...
Hadoop生态圈框架部署(八)- Hadoop高可用(HA)集群部署
文章目录 前言一、部署规划二、Hadoop HA集群部署(手动部署)1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 …...
抗干扰设计的检查细则
抗干扰设计是确保电子系统或设备在复杂电磁环境中稳定运行的重要环节,涉及多个方面的设计和实施。以下是对抗干扰设计的检查细则的详细归纳: 一、电源线与地线设计 电源线设计:选择合适的电源,尽量加宽电源线,保证电源…...
[Redis#12] 常用类型接口学习 | string | list
目录 0.准备 1.string get | set set_with_timeout_test.cpp set_nx_xx_test.cpp mset_test.cpp mget_test.cpp getrange_setrange_test.cpp incr_decr_test.cpp 2.list lpush_lrange_test.cpp rpush_test.cpp lpop_rpop_test.cpp blpop_test.cpp llen_test.cpp…...
React的ts文件中通过createElement拼接一段内容出来
比如接口返回一个值 const values [23.00, 40.00/kg];想做到如下效果, 如果单纯的用render渲染会很简单, 但是在ts文件中处理,所以采用了createElement拼接 代码如下: format: (values: string[]) > {if (!values || !val…...
【Git系列】Git 提交历史分析:深入理解`git log`命令
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
深度学习笔记——生成对抗网络GAN
本文详细介绍早期生成式AI的代表性模型:生成对抗网络GAN。 文章目录 一、基本结构生成器判别器 二、损失函数判别器生成器交替优化目标函数 三、GAN 的训练过程训练流程概述训练流程步骤1. 初始化参数和超参数2. 定义损失函数3. 训练过程的迭代判别器训练步骤生成器…...
《地球科学与环境学报》
《地球科学与环境学报》报道范围涵盖基础地质、矿产地质、水资源与环境、工程地质、地球物理、地球信息科学等领域,刊载国内外未公开发表的有创新性或意义重大的研究论文和综述文章。 来稿必须包括以下项目:题名(尽可能不要超过20字&…...
k8s 1.28 聚合层部署信息记录
–requestheader-client-ca-file –requestheader-allowed-namesfront-proxy-client –requestheader-extra-headers-prefixX-Remote-Extra- –requestheader-group-headersX-Remote-Group –requestheader-username-headersX-Remote-User –proxy-client-cert-file –proxy-cl…...
组件化设计的意义
鸿蒙操作系统(HarmonyOS)是华为公司开发的一款面向未来、面向全场景的分布式操作系统。它不仅能够支持多种智能终端设备,还能够实现跨设备之间的协同工作。为了满足不同设备的资源能力和业务需求,鸿蒙操作系统采用了组件化的设计方…...
2025 年河北省职业院校大数据应用与 服务(中职组)赛项样题
— 1 — 2025 年河北省职业院校大数据应用与 服务(中职组)赛项样题 一、背景描述 近年来,随着旅游业的快速发展和社交媒体的普及,一 些目的地因其独特的魅力或者事件而迅速走红,吸引了大量 游客涌入,使得当…...
宏集eXware物联网网关在水务管理系统上的应用
一、前言 水务管理系统涵盖了对城市水网、供水、排水、污水处理等多个环节的监控与管理。随着物联网(IoT)技术的快速发展,物联网网关逐渐成为水务管理系统中的关键组成部分。 宏集物联网网关以其高效的数据采集、传输和管理功能,…...
【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出,万山无阻 目录 📖一、算法思想 细节问题 📚左右临界 📚中点选择 📚…...
yolov5 解决:export GIT_PYTHON_REFRESH=quiet
当我们在第一次运行YOLOv5中的train.py程序时:可能会出现以下报错: This initial warning can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silen…...
MongoDB聚合操作
1.聚合操作 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。 单一作用聚合:提供了对常见聚合过程的简单访问,…...
Apple雷电5到底有多快?
在科技日新月异的今天,苹果公司始终走在技术创新的前沿。2023年9月12日,随着英特尔发布雷电5(Thunderbolt 5)规范,苹果迅速跟进,将其应用于自家的产品中。雷电5接口以其卓越的性能,彻底颠覆了我…...
项目快过:知识蒸馏 | 目标检测 |FGD | Focal and Global Knowledge Distillation for Detectors
公开时间:2022年3月9号 项目地址:https://github.com/yzd-v/FGD 论文地址:https://arxiv.org/pdf/2111.11837 知识蒸馏已成功地应用于图像分类。然而,目标检测要复杂得多,大多数知识蒸馏方法都失败了。本文指出&#…...
Spring Boot日志总结
文章目录 1.我们的日志2.日志的作用3.使用日志对象打印日志4.日志框架介绍5.深入理解门面模式(外观模式)6.日志格式的说明7.日志级别7.1日志级别分类7.2配置文件添加日志级别 8.日志持久化9.日志文件的拆分9.1官方文档9.2IDEA演示文件分割 10.日志格式的配置11.更简单的日志输入…...
PostgreSQL最常用数据类型-重点说明自增主键处理
简介 PostgreSQL提供了非常丰富的数据类型,我们平常使用最多的基本就3类: 数字类型字符类型时间类型 这篇文章重点介绍这3中类型,因为对于高并发项目还是推荐:尽量使用简单类型,把运算和逻辑放在应用中,…...
androidstudio 最新继承 proto kts 方式
在Android Studio中,如果你使用的是Kotlin DSL(.kts文件)来配置你的Gradle项目,并且你想集成Protocol Buffers(Proto),你需要稍微调整你的配置方式。以下是如何在Kotlin DSL中配置Proto集成的步…...
【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习
目录 1、TB6612电机驱动芯片 1.1如下是芯片的引脚图: 1.2如下图是电机的控制逻辑: 1.3MOS管运转逻辑 1.3典型应用电路 2、H桥驱动电路 2.1、单极模式 2.2、双极模式 2.3、高低端MOS管导通条件 2.4、H桥电路设计 2.5、自举电路 3、电气特性 3…...
【AI战略思考13】克服懒惰,保持专注,提升效率,不再焦虑
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 引言 我发现自己最近非常懒惰,浪费了很多时间,也容易分心,不够专注,效率低下,且每天都有点焦虑,因此制定了下面的要求和作息时间表。 目…...
基于Vue3+Element Plus 实现多表单校验
使用场景 表单校验在日常的开发需求中是一种很常见的需求,通常在提交表单发起请求前校验用户输入是否符合规则,通常只需formRef.value.validate()即可校验,但是,例如一些多步骤表单、动态表单、以及不同的用户角色可能看到不同的表…...
“岗位复合化、技能层次化” 高职大数据技术专业人才培养实践
在全球数字化浪潮的推动下,大数据技术已经成为引领社会进步和经济发展的核心动力。随着《关于深化现代职业教育体系建设改革的意见》等系列指导问文件的发布,我国高职大数据技术专业的教育正迎来全新机遇与挑战。这些政策不仅明确了职业教育改革的方向&a…...
Day2 生信新手笔记: Linux基础
一、基础知识 1.1 服务器 super computer 或 server 1.2 组学数据分析 组学数据:如基因组学、转录组学、蛋白质组学等; 上游分析:主要涉及原始数据的获取和初步处理,计算量大,消耗的资源较多,在服务器完…...
AI开发-数据可视化库-Seaborn
1 需求 概述 Seaborn 是一个基于 Python 的数据可视化库,它建立在 Matplotlib 之上。其主要目的是使数据可视化更加美观、方便和高效。它提供了高层次的接口和各种美观的默认主题,能够帮助用户快速创建出具有吸引力的统计图表,用于数据分析和…...
如何把Qt exe文件发送给其他人使用
如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹,存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩,发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…...
力扣103.二叉树的锯齿形层序遍历
题目描述 题目链接103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1ÿ…...
MOH: MULTI-HEAD ATTENTION AS MIXTURE-OFHEAD ATTENTION
当前的问题 多头注意力使用多个头部可以提高模型的精度。然而,并不是所有的注意力头都具有同样的重要性。一些研究表明,许多注意力头可以被修剪而不影响准确性。 此外,在多头注意中,每个注意头并行操作,最终输出是所…...
Linux的文件系统
这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点:多级索引…...
力扣78题详解:C语言实现子集问题
力扣78题详解:C语言实现子集问题 题目描述 给定一个不含重复元素的整数数组 nums,返回其所有可能的子集(幂集)。 说明:解集不能包含重复的子集,顺序无关。 示例 输入:nums [1,2,3] 输出&am…...
按行数据拆分到工作表-Excel易用宝
有这样一份工作表,现在要对工作表按指定行数进行拆分,如果你还在选择数据区域复制粘贴到每个工作表中,那这样的效率也太低了。 按指定行数拆分工作表,就用易用宝。 单击Excel易用宝,合并与拆分,拆分工作表…...
.net core 创建linux服务,并实现服务的自我更新
目录 创建服务创建另一个服务,用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件:yourapp.service,内容如下: [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…...
无人机的起降装置:探索起飞和降落的秘密 !
一、起降系统的运行方式 起飞方式 垂直起飞:小型无人机通常采用垂直起飞方式,利用螺旋桨产生的升力直接从地面升起。这种方式适用于空间有限或需要快速起飞的场景。 跑道起飞:大型无人机或需要较长起飞距离的无人机,可能会采用…...
Apache Airflow 快速入门教程
Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …...
数学题转excel;数学题库;数学试卷转excel;大风车excel
一、数学试卷转excel 有些需要刷题的朋友,需要将题库数学题转为excel格式,便于管理 前端时间帮一位朋友实现了数学题转excel,包括选择题、填空题、分析题 示例: 二、问题 数学题是最难以处理的试题,理由如下 1、有…...
【C++】类和对象(下)
目录 前言 一、再探构造函数 二、类型转换 三、static 成员 四、友元 五、内部类 六、匿名对象 七、对象拷贝时的编译器优化 总结 前言 本文主要内容:构造函数的再探--初始化列表、内置类型与自定义类型之间的转换、类的static成员、友元、内部类、匿名对…...
vue多页面应用集成时权限处理问题
在多页面应用(MPA)中,权限管理通常会涉及到每个页面的访问控制、身份验证、以及权限校验。以下是几种常见的权限处理方式: 1. 前端路由权限控制 原理:虽然是多页面应用,通常每个页面会独立加载和渲染&…...
输出保留3位小数的浮点数
输出保留3位小数的浮点数 C语言代码C代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 读入一个单精度浮点数,保留3位小数输出这个浮点数。 输入 只有一行,一个单精度浮点数。 输出 也只有一…...
openssl的运用
一、概述 Opssl是一个用于TLS/SSL协议的工具包,也是一个通用密码库。 包含了国密sm2 sm3 sm4,包含了对称加密,非对称加密,单项散列,伪随机、签名,密码交换,证书等一些算法库。 为了深层次的学习…...
C++STL之vector(超详细)
CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀Ὠ…...
RabbitMQ消息可靠性保证机制5--消息幂等性处理
RabbitMQ层面有实现“去重机制”来保证“恰好一次”吗?答案是没并没有,而且现在主流的消息中间件都没有实现。 一般解决重复消息的办法是:在消费端让我们消费消息操作具有幂等性。 幂等性问题并不是消息系统独有,而是࿰…...
24/12/1 算法笔记<强化学习> 创建Maze交互
我们今天制作一个栅格的游戏。 我们直接上代码教学。 1.载入库和查找相应的函数版本 import numpy as np import time import sysif sys.version_info.major 2:import Tkinter as tk else:import tkinter as tk 2.设置长宽和单元格大小 UNIT 40 MAZE_H 4 MAZE_W 4 3.初始…...
c++:模版 template
一、模版 1.格式: template <typname T> 2.实现 2.1自动推导 模板只对紧跟在后面的第一行代码有效,如果后面还想定义模板函数需要重新定义模板 #include <iostream> #include <string>template <typename T> void Print(T v…...
javascript切换类、删除类、修改类以及增加类
在JavaScript中,操作DOM元素的类(class)是一个常见的操作。以下是一些基本的方法来切换类、删除类、修改类以及增加内联样式: 切换类(Toggle Class) 切换类意味着如果类存在则移除它,如果不存…...
区块链学习笔记(2)--区块链的交易模型part1
模型基础 区块链的tx分为两种模型,分别是比特币为代表的UTXO(Unspent Transaction Output)模型,和以太坊为代表的Account模型。前者适用于货币记账,后者适用于链上应用。 UTXO模型 类似于现金的交易模型 一个tx包含…...
反射知识总结
狂神说 反射的功能: 类加载内存分析 类加载的时候,class对象就形成了。 类无论有多少对象,class对象只有一个。 获取类对象三种方式 反射,就是通过api获取一个类的类对象: 有三种方式: 方法一…...
selenium部署分布式 UI 自动化测试环境-Docker
一、根据selenium/hub官网的配置信息,进行配置。 How to run this image The Hub and Nodes will be created in the same network and they will recognize each other by their container name. A Docker network needs to be created as a first step.Create …...