自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 Sqlmap常见命令速记

sqlmap的常见命令

2022-06-07 14:50:39 1058 1

原创 谷歌语法和FOFA常用语法总结

谷歌语法和FOFA常用语法总结

2022-06-07 14:29:52 2185

原创 XSS攻击脚本构造原理与防御

攻击危害1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力3、盗窃企业重要的具有商业价值的资料4、非法转账5、强制发送电子邮件6、网站挂马 让更多人的受害7、控制受害者机器向其它网站发起攻击 卖肉机攻击分类反射型非持久性跨站点脚本攻击攻击是一次性的,仅对当次的页面访问产生影响存储型持久型跨站点脚本攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在DOM型既可能是反射型的,也有

2022-05-25 19:42:09 343

原创 SQL注入原理与防御姿势(问答方式 描述)

SQL注入原理?通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令SQL注入危害?数据库层面非法读取、篡改、添加、删除数据库中数据盗取用户的各类敏感信息,获取利益·通过修改数据库修改网页上的内容私自添加或者删除账号操作系统层面网页篡改网络挂马服务器远程控制 SQL注入有哪些分类?基于注入点值数值型 sql=“select * from admin where id=1”字符串型 sql=”select

2022-05-25 18:52:44 447

原创 Makefile总结

命名:都小写第一个字母大写,其余小写规则:目标,依赖,命令第一种方式:app:main.c sub.c add.c gcc main.c sub.c add.c #使用make后生成可执行文件名为app缺点:当文件数量庞大时,修改其中一个文件会涉及到所有文件的修改,效率十分低下第二种方式:Makefile原理:需要生成的可执行文件一定要在第一排通过时间的目标与依赖的时间关系检查是否需要更新Makefile变量在Vim里用%进行字符匹配,不是*Makefi

2022-04-16 22:16:01 1280

原创 Linux通配符与环境变量

Linux通配符 (Wildcard)用途:在查询,输入文件名时获得更高的效率?字符?字符代表单个字符# 已存文件:a.txt, b.txt$ ls ?.txta.txt b.txt可以看到 ?匹配了任何单个字符,所以a.txt和b.txt都在了?.txt 的匹配范围内。如果要匹配多个字符,连用多个 ? 即可:# 已存文件 a.txt, b.txt, abc.txt, file1.txt, file2.txt$ ls ???.txtabc.txt$ ls file?.txtfile

2022-04-16 19:03:06 1236

原创 力扣954:二倍数对数组( 适合使用 map 和 hash 的题目场景)

最近在准备蓝桥杯,今天刷题见到了一道有趣的题目,在这里分享一下。题目内容:见此处分析:题目的内容就是找数组中关系两倍的数,找到一对就消一对,消完所有有两倍关系的数之后看是否还有剩余的数没消,要是没有则返回真,反之返回假。更多细节讲解插入在代码里👇解题代码class Solution {public: bool canReorderDoubled(vector<int>& arr) { map<int, int> map; for (auto& .

2022-04-02 00:00:02 377

原创 基数排序(C/C++实现)

算法精髓(假设升序)将原数组按个位数字的大小进行桶排序,各个桶之间装着个位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按个位数从小到大有序将数组再按十位数字的大小进行桶排序,各个桶之间装着十位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按十位数从小到大有序将数组再按百位数字的大小进行桶排序,各个桶之间装着十位数相同的原数组内的元素将得到的各位有序的数组赋值给原数组。此时数组按百位数从小到大有序重复上述步骤,直到原数组内所有元素都以按照每一位数进行排

2022-03-29 21:16:17 921

原创 桶排序(C/C++实现)

算法精髓有一个元素均匀分布的原数组。创建多个临时数组将原数组内的元素按大小分层级装在不同的临时数组中在几个临时数组中分别排序将每一个临时数组中的值按大小转入原数组中。算法实现#include<iostream>#include<vector>#include<algorithm> using namespace std;void Bubble_sort(int arr[], int len){ if (len < 2)return;

2022-03-29 20:00:16 2640

原创 计数排序(C/C++实现)

算法精髓-遍历待排序数组,找出最大值与最小值,并计算其差值。创建临时数组,大小为其差值。再次遍历原数组,对遍历到的每一个值在临时数组中加一,记录原数组中该值出现了n次。将临时数组中不为0的值从小到大加上最小值输出n次。算法实现#include<stdio.h>#include<assert.h>#include<stdlib.h>//计数排序void CountSort(int* a, int len){ assert(a); //通过max和m

2022-03-28 17:58:39 617

原创 堆排序(C++实现)言简意赅版

算法精髓(假设升序排列)将待排序数组整合成一个完全二叉树。将二叉树构造成一个大根堆(即相邻两层上层元素总是大于下层元素)将根(即数组首元素)与树的尾节点(即数组末尾元素)值进行交换。这时最大元素到了数组末尾,叶节点的值较小的元素到了根处。将该较小元素通过元素下沉再次构造成大根堆选出数组中第二大元素,完成大根堆构造后再次与末尾节点交换位置。此时把第二大元素交换到了倒数第二个位置。重复上述步骤,直到完成排序代码实现与测试元素下沉函数的循环实现:#include<iostream>

2022-03-27 16:06:15 1542

原创 归并排序(C++实现)言简意赅版

算法精髓将一个无序长度为n的数列看成n个只有一个元素的数列,这n个元素都是有序的将n个子数列两两排序,得到n/2个有序的分别有两个元素的数列将n/2个子数列再两两排序,得到n/4个有序的子数列。重复上述步骤,最终得到一个有序数列算法实现(递归实现)#include<iostream>#include<algorithm>//44,3,38,5,47,15,36,26,27,2,46,4,19,50,48void Merge_sort_main(int arr[

2022-03-25 14:04:45 1661

原创 快速排序(C++实现)言简意赅版

算法精髓双指针进行首尾遍历,其中以首指针值为基准值,从尾开始向首遍历,当尾遇到小于基准的,便将其值赋予首,尾暂停。尾暂停后,首开始向尾遍历,当首遇到大于基准值的,便将其值赋予尾。首暂停。在首尾相遇之前,反复交替进行上述两个步骤,当首尾相遇时,首尾的值便是由其他值赋予而来,这时用基准值覆盖首尾相遇点的值。这时完成第一次排序,此时基准值左边的值皆小于基准值,基准值右边的值皆大于基准值。再以首到基准值和基准值到尾的区域内再次进行上述排序,直到每个区域间只有两个元素即两端的元素。算法实现void

2022-03-25 00:42:09 1462

原创 希尔排序(C++实现)

算法思想减少元素查找次数减少元素移动次数算法精髓(假设进行升序排序)一共有n个待排序元素。第一轮按每隔n = n/2 - 1个元素分为一组,划分为若干组。在每一组内各自用插入排序使各自组内元素有序。第二轮按n = n/2 - 1个元素再分为若干组,各组内进行组内排序直到n = 0时整个数组为一组,进行插入排序实现//数组首地址,数组长度,分组起始位置,步长void group_sort(int arr[], int length, int start, int step){

2022-03-22 18:11:37 1127

原创 插入排序(C++实现)言简意赅版

算法精髓(默认升序排序)像斗地主抽牌一样,以第一个元素为基准,将接下抽到的元素插入已排序元素中每次抽取未排序的元素中的第一个元素,比对其与前面已排序元素的大小关系记录下该元素的值在已排序区从后往前比对,当某元素大于该元素,则将该元素位置后移一位直到某元素小于该元素,则将该元素插入某元素的后一位,完成一轮插入从未排序区选择第一个元素,再次进行比对算法实现(第1种)void Insert_sort(int arr[], int length){ if (length < 2)ret

2022-03-22 17:06:19 2391

原创 选择排序(C++实现)言简意赅版

算法精髓(假设升序排列)每次比对为待选择区第一个元素。外层循环确定每一轮比对待选择元素数目内存循环遍历当前轮所有待选择元素,选择出最小元素:当元素小于第一个元素时记录其位置,以该位置元素作为当前轮暂时最小元素继续比对。比对完成后将最小元素角标对应元素值与第一个元素值交换。进行新一轮比对。一般实现:void Select_sort(int* arr, int length){ if (length < 2)return;//1个元素不需要排序 for (int i = 0;i &

2022-03-22 01:30:03 1186

原创 冒泡排序(C++实现)言简意赅版

算法分析冒泡排序每次只比对相邻两个,将较大值向后放(假设升序排列)。外循环规定每一轮遍历要比较的元素个数,内循环选出最大值当第一轮比对结束后,则数组末尾便是最大值,因此在后续排序中不需要再参与。选出最大值并放在末尾后,下一轮外循环便减少一个要比较的元素数目。内循环继续比较,再次选出最大值放在末尾。直到排序完成,即外循环中需要比较的元素清零。一般实现://普通实现:void Bubble_sort(int* arr, int length){ for (int i = length

2022-03-22 00:51:00 663

原创 二叉平衡树(C语言实现)超级简洁版

数据结构定义#define AVL_NODE_CHILE 0#define AVL_NODE_PARENT 1//平衡二叉树节点typedef struct avl_node{ int key;//关键字 avl_node* left;//左孩子 avl_node* right;//右孩子 int height;//节点高度}avl_node;//二叉树本身typedef struct avl{ //根节点 avl_node* root; int size;//节点数目

2022-03-21 00:14:27 926

原创 二叉搜索树(C语言实现)超级简洁版

数据结构设计#define BST_NODE_CHILD 0#define BST_NODE_PARENT 1//bst的节点typedef struct bst_node{ //关键字 int key; //左孩子 bst_node* left; //右孩子 bst_node* right;}bst_node;//bst树typedef struct bst{ //树的节点 struct bst_node* root; //记录树的节点数目 int size;}

2022-03-20 01:28:22 626

原创 二叉树(C语言实现)超级简洁版

数据结构设计//树的节点typedef struct tree_node{ struct tree_node* left; struct tree_node* right; char key;}tree_node;接口设计//创建一个节点tree_node* tree_create_node(char key);//创建一颗二叉树tree_node* tree_create();//前序遍历 |递归式|(中->左->右)void pre_order_travers

2022-03-18 01:41:10 1470

原创 哈希表(C语言实现)超级简洁版

数据结构设计//字典类型#define DICT_TYPE_INT 0#define DICT_TYPE_STR 1//键值对typedef struct dict_entry{ struct dict_entry* next; void* key; void* value;}dict_entry;typedef struct dict{ //哈希函数 unsigned int (*hash)(void* key); // table 数组存放 dict_entry 指针

2022-03-16 23:10:04 2770

原创 Linux 基础编程 -- gdb调试

gcc -main.c hello.c -o app1 -I head -g(使用 -g将源程序带调试信息打包为可执行程序app1)执行gdb调试gdb app1(用gdb调试上述可执行程序)start(让程序开始执行,执行一步后停下)r或者run(让程序继续执行直到遇到断点或者结束)n(下一步,开始单步调试,遇到函数不进入函数内部)s(下一步,开始单步执行,遇到函数则进入函数)c(程序继续执行到断点处或执行至结束)查看代码l(显示main函数文件内容)l 10(显示第10行附近的代码段

2022-03-16 20:42:39 407

原创 Linux 基础编程 -- 静态库与动态库的制作和使用

**命名规则:lib storehouse .a **libmytest.a(给要制作的静态库命名为mytest)制作步骤:将源文件生成对应 .o 文件ar rcs libmytest.a 所有 .o 文件(将 .o 文件打包)(ar是打包工具,rcs是打包相关参数,libmytest.a是静态库名,所有 .o 文件是静态库需要用到的源文件)发布和使用静态库将生成静态库和头文件发布使用方法:gcc main.c ./libmytest.a -o app(静态库的调用方法,main文件中

2022-03-16 13:25:26 1199

原创 Linux 下的 gcc 编译常用命令

gcc:Linux下的一款编译器。gcc工作流程:完整编译流程:创建一个c语言源文件:gcc -E hello.c -o hello.i(头文件展开,进行源文件中的宏替换,注释过滤)gcc -S hello.i -o hello.s(将源文件编译成汇编文件)(这一阶段耗时最大)gcc -c hello.s -o hello.o(将汇编文件转换成二进制文件)gcc hello.o -o hello(将二进制文件打包成可执行文件)简单编译方式:gcc hello.c -o hello(将he

2022-03-15 17:32:07 12818

原创 Linux 基础编程--vim的常用快捷键

vi:Linux编辑器始祖,vim就是从vi发展而来vim命令模式(打开文件默认进入)光标移动:h(光标左移)l(光标右移)j(光标下移)k(光标上移)0(到行首)$(到行尾)gg(到文件首)G(到文件末)num G(到第num行)删除操作:x(删除光标所在字符)X(删除光标前一个字符)u(撤销删除)dw(如光标在单词第一个字符处就删除单词,否则删除单词在光标之后的部分)d0(删除本行开始知道光标之前一个字符处)d$ 或D(删除本行光标及之后的部分)dd(删除光标所

2022-03-14 23:52:59 1343

原创 双链表(C语言实现)超级简洁版

数据结构设计//定义迭代器迭代方向#define LIST_START_HEAD 0#define LIST_START_TAIL 1//链表节点typedef struct list_node{ struct list_node* prev; struct list_node* next; void* value;}list_node;//链表typedef struct list{ unsigned int length; list_node* head; list_

2022-03-14 15:18:15 370

原创 队列(C语言实现)超级简洁版

数据结构设计//节点数据结构typedef struct queue_node{ queue_node* next; void* data;}queue_node;//队列数据结构typedef struct queue{ queue_node* head; queue_node* tail; int length;}queue;接口设计//创建队列queue* queue_create();//入队queue* queue_push(queue* queue,voi

2022-03-14 00:00:02 1417

原创 栈(C语言)超级简洁版

数据结构设计:typedef struct stack_node{ struct stack_node* next; void* data;}stack_node;typedef struct stack{ struct stack_node* top; int length;}stack;接口://创建栈stack* createStack();//入栈stack* stack_push(stack* stack, void* data);//出栈void* stac

2022-03-13 01:28:18 885

原创 Linux 基础编程 -- 解压缩、网络管理、用户管理、帮助文档使用

网络管理:who:查看当前用户在线状况tty1-7:1~6:文字终端,7:图形终端ps a:列出当前所有运行程序运行情况ps au:以用户为主显示所有程序运行状况ps aux:以用户为主显示所有终端所有程序运行状况ps aux |grep root:显示所有root相关运行程序(grep:查找符合条件的字符串)(管道:将指令1的结果作为输入传入指令2,将指令2的处理结果显示在屏幕上)kill -9 pid:终结进程pidenv | grep PATH:查看当前进程的环境变量(linux环境变

2022-03-12 22:26:54 1167

原创 unique_lock()使用

一、unique_lock():是一个类模板,可以取代lock_guard(),相比起来前者更灵活,但效率较差,内存占用较多 ,一般工作中推荐使用lock_guard()。二、unique_lock()的第二个参数:2.1 std::adopt_lock:表示互斥量已经被lock,则在第二个参数添加此标志。(使用此参数则当前线程之前未使用lock())。 my_mutex1.lock(); std::lock_guard<std::mutex>myLockGuard(my_mutex1

2022-03-11 00:30:10 2223

原创 单例设计模式和多线程

一、设计模式杂谈:在特别大的项目中,把项目的开发经验、模块划分经验,总结整理成设计模式程序灵活,维护起来可能方便,但是用设计模式理念写出来的代码晦涩难理解。设计模式有其独特的优点,要活学活用,不要深陷其中,生搬硬套二、单例设计模式:整个项目中,有某个或者某些特殊的类,只能创建一个属于该类的对象。单例类:只能生成一个对象。class MyCAS{private: MyCAS() {};private: static MyCAS* m_instance;public: sta

2022-03-11 00:29:53 165

原创 关于std::future成员函数wait_for()

一、关于std::future成员函数wait_for():1.1 关于std::future_status:std::future_status是一个枚举类型,其值有三:// ENUM future_statusenum class future_status { // names for timed wait function returns ready, timeout, deferred//延迟执行,当std::async()第一个参数为std::lanuch::de

2022-03-11 00:29:39 5702

原创 Linux 基础编程 -- 链接、文件权限、文件查找

改名:mv filename1 filename2:将filename1改名为filename2mv filename dir:将文件移动到dir处文件/目录创建快捷方式:(记录下文件路径直接访问)ln -s file name.soft:移动后别处不可访问ln -s file 文件路径 name:全局可访问硬链接:(给文件取别名)(并不占磁盘空间)(相当于share_ptr)(不能给目录创建硬链接)ln file file.hard:给file创建硬链接名为file.hardrm file

2022-03-11 00:28:58 220

原创 链表(C语言)超级简洁版

数据结构设计://定义链表节点结构体: struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val) :val(val), next(nullptr) {} }; //构造函数初始化链表 MyLinkedList() { //定义一个虚拟头节点 _size = 0; _dummyHead = new LinkedNode(0); }接口设计: int get(int index);//获取

2022-03-11 00:27:56 543 1

原创 线性表基本操作

数据结构设计:const int MAXSIZE = 20;//线性表大小typedef int position;//设置别名代表的当前位置struct LNode//结构体定义{ int Data[MAXSIZE];//线性表大小 position last;//当前位置};typedef struct LNode* List;//用List代替struct LNode*接口设计:List makeEmpty() ;//初始化position Find(int k, co

2022-03-10 00:27:40 73

原创 互斥量基本概念

一、互斥量(mutex)的基本概念互斥量就是个类对象,可以理解为一把锁,多个线程尝试用lock()成员函数来加锁,只有一个线程能锁定成功,如果没有锁成功,那么流程将卡在lock()这里不断尝试去锁定。互斥量使用要小心,保护数据不多也不少,少了达不到效果,多了影响效率。二、互斥量的用法2.1 lock(),unlock()添加头文件:#include<mutex>声明与创建:std::mutex my_mutex;先lock()—>操作共享数据—>unlock()

2022-03-10 00:26:32 2019

原创 关于线程参数

一、传递临时对象作为线程参数1.1要避免的陷阱1:void myPrint(const int &i, char* pmybuf){ //如果线程从主线程detach了 //i不是mvar真正的引用,实际上值传递,即使主线程运行完毕了,子线程用i仍然是安全的,但仍不推荐传递引用 //推荐改为const int i cout << i << endl; //pmybuf还是指向原来的字符串,所以这么写是不安全的 cout << pmybuf &lt

2022-03-10 00:26:06 531

原创 async和package_task和promise

一、std::async、std::future:std::async是一个函数模板,用来启动一个异步任务,它返回一个std::future对象,这个对象是个类模板。这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。二、std::future的get()与wait():get()成员函数会等待线程执行结束 返回结果,拿不到结果它就会一直等待。get()只能调用一次。std::future对象的wait()成员函数

2022-03-10 00:25:26 423 2

原创 Windows临界区

一、windows临界区Windows临界区:(使用前必须初始化)//创建: CRITICAL_SECTION my_winsec;//创建windows中的临界区,类似与互斥量,使用前必须初始化//初始化:(通常在类构造函数中初始化) InitializeCriticalSection(&my_winsec);//初始化临界区//临界区使用: EnterCriticalSection(&my_winsec);//进入临界区(加锁) myQueue.push_back(i

2022-03-10 00:24:32 1339

原创 条件变量相关

一、条件变量condition_variable:std::condition_variable实际上是一个类,是一个和条件相关的类,条件达成与否决定该类对象的值。std::condition_variable my_cond;//生成一个条件变量对象二、wait()与notify_one()函数的搭配使用:wait()函数使用:wait()决定线程是否阻塞,其第二个参数默认为false。当第二个参数为true时,wait()直接返回并此线程继续执行。当第二个参数的值为false()时,w

2022-03-10 00:22:38 106

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除