自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C条件编译

条件编译在编译一个程序的时候可以使用条件编译指令将一组语句编译或放弃。1#if 常量表达式 //...#endif测试用例,常量表达式为真(除0外),则编译,为假(0)则不编译#include<stdio.h>int main() { char arr1[] = "条件为真"; char arr2[] = "条件为假";#if 1 printf("%s\n", arr1);#endif#if 0 printf("%s\n", arr2);#endif get

2022-05-09 13:24:49 377

原创 字符串函数--strncat

strncatchar* strncpy(char* destination, const char* source, size_t num);1.追加num个字符从源字符串到目的空间2.追加num个字符后,再自动给最后补个’\0’。int main() { char arr1[10] = "abcd\0#####"; char arr2[] = "hello"; strncat(arr1, arr2, 3); printf("%s\n", arr1); getchar(); retu

2022-05-06 11:06:57 214

原创 字符串函数--strncpy以及模拟实现

strncpychar* strncpy(char* destination, const char* source, size_t num);1.拷贝num个字符从源字符串到目的空间2.如果源字符串的长度小于mun,则拷贝完源字符串之后,在目标的后面加0,直到num个。#include<stdio.h>int main() { char arr1[10] = "abcdef"; char arr2[] = "hello world"; strncpy(arr1, arr2,

2022-05-05 21:25:43 234

原创 字符串函数--strcmp以及模拟实现

strcmpint strcmp(const char* str1, const char* str2);1.第一个字符串大于第二个字符串,返回大于0的数字,VS中一般是12.第一个字符串大于第二个字符串,返回0,VS中一般是03.第一个字符串小于第二个字符串,返回小于0的数字,VS中一般是-1一般是从左到右按照ASCII值比较strcmp的模拟实现在这里插入代码片...

2022-05-05 16:23:29 329

原创 字符串函数--strcat以及模拟实现

strcatchar* strcat(char* destination, const char* source);1.源字符串必须以’\0’结束2.目标空间必须足够大,能容纳下源字符串的内容3.目标空间必须可修改strcat函数的分析int main() { char* arr1[10] = "abcd"; const char* arr2[] = "mf"; strcat(arr1,arr2); printf("%s\n", arr1); getchar(); return 0

2022-05-05 15:40:44 214

原创 字符串函数--strcpy以及模拟实现

strcpychar* strcpy(char* destrination, const char source);1.源字符串必须以’\0’结束2.会将字符串中的‘\0’拷贝到目标空间3.目标空间必须足够大,以确保能够存放源字符串4.目标空间必须可变strcpy函数的分析#include<stdio.h>int main() { char arr1[10] = "abcde"; const char arr2[] = "mf"; strcpy(arr1, arr2

2022-05-05 14:25:57 145

原创 字符串函数--strlen以及模拟实现

strlensize_t strlen(const char* str)1.字符串是’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现字符的个数2. 参数指向的字符串必须要以’\0’结束3. 注意函数的返回值是size_t,是无符号的(所以两个字符串长度相加减永远是正数)计数器方法模拟实现strlen函数#include<stdio.h>#include<assert.h>int my_strlen(const char* str) {

2022-05-05 13:50:21 213

原创 枚举和共用体

枚举类型直接看代码解释#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>enum Sex { // 枚举的可能取值-常量 MALE, FEMALE, SECRET };int main() { enum Sex s = MALE; s = FEMALE; //FEMALE = 3;//报错 //s = 3;//没报错,但是语法不严格 printf("%d\n", MALE); printf("%d\n",

2022-05-03 12:33:22 256

原创 结构体进阶(2)---结构体内存对齐

结构体内存对齐首先看一段代码#include<stdio.h>struct S1 { char c1; int a; char c2;};struct S2 { char c1; char c2; int a;};int main() { struct S1 s1 = { 0 }; printf("%d\n", sizeof(s1)); struct S2 s2 = { 0 }; printf("%d\n", sizeof(s2)); getchar

2022-04-18 20:05:43 172

原创 结构体进阶(1)---结构体类型的创建

匿名结构体类型再声明结构的时候,可以不完全的声明。以下代码省略了标签,所以只能使用已经创建好的变量,不能再通过结构体创建新的变量// 匿名结构体类型struct { char name[20]; short int price; short int version;//全局变量}book1, book2;struct { char name[20]; short int price; short int version;//全局变量}*book3,books[2];int m

2022-04-12 17:44:06 219

原创 动态内存分配---柔性数组

柔性数组柔性数组指的是结构体类型变量,最后一个元素是数组的话,此数组大小是可以变化的测试代码struct Stu { int n; int arr[0];//未知大小,素组大小可以调整};//第二种写法//struct Stu {// int n;// int arr[];//未知大小,素组大小可以调整//};int main() { struct Stu s; printf("%d\n", sizeof(s)); getchar(); return 0;}输出结果是

2022-04-11 11:15:33 190

原创 C/C++程序内存分配的四个区域

C/C++程序内存分配的几个区域1 栈区(stack): 在执行函数是,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束后这些寻出单元资源被释放。栈内存分配内置与处理器的指令集中,效率很高,但是分配的内存容量有限。栈主要存放运行函数而分配的局部变量,函数参数,返回数据,返回地址等。2 堆区(heap): 一般由程序员自己分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。3 静态区(数据段):存放全局变量,静态数据(static),程序结束由系统释放.4 代码段:存放函数

2022-04-07 19:59:00 972

原创 动态释放内存经典面试题

第一题void GetMemory(char* p){ char* p = malloc(40);}void Test(void) { char* str = NULL; GetMemory(str); strcpy(str, "hello world"); //程序奔溃 printf(str);}int main() { Test(); return 0;}代码执行后奔溃。这个代码有两处错误str 指针想申请内存空间,可是将str传入GetMemory函数后,

2022-04-07 19:18:50 327

原创 常见动态内存错误

1 对NULL指针的解引用操作没有判断是否成功开辟内存,没开辟成功的话,直接对返回的NULL指针进行解引用操作。 int* p = (int*)malloc(10 * sizeof(int)); *p = 20; free(p);2 对动态开辟的内存的越界访问 int* p = (int*)malloc(5 * sizeof(int)); if (p == NULL) { printf("%s", strerror(errno)); } else { for (int i = 0

2022-04-05 18:39:09 304

原创 动态内存分配---calloc,realloc

calloc函数声明:void *calloc(size_t nitems, size_t size)nitems – 要被分配的元素个数。size – 元素的大小。该函数返回一个指针,指向已分配的内存。如果请求失败,则返回 NULL。malloc 和 calloc 之间对比:malloc 不会设置内存为零,而 calloc 会设置分配的内存为零测试代码:...

2022-04-04 22:23:29 554

原创 动态内存分配---malloc,free

mallocvoid *malloc(size_t size)所申请内存的单位是字节,返回所指向申请内存的指针,如果申请内存失败,返回NULL返回的类型为void* ,所以malloc函数并不知道开辟空间的类型,具体还需要使用者自己来决定。如果参数size为0,malloc的行为标准是未定义的,取决于编译器。测试用例1 申请成功#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#

2022-03-31 14:32:08 1263

原创 猜数字小游戏

srand(): 随机种子rang():生成随机数代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>//进入猜数字游戏void game(){ // RAND_MAX 32767 int guess_number = 0; int ret = rand() % 100 +

2022-03-31 12:11:26 3998

原创 指针进阶--qsort函数的实现

qsort函数void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*));base – 指向要排序的数组的第一个元素的指针。nitems – 由 base 指向的数组中元素的个数。size – 数组中每个元素的大小,以字节为单位。compar– 用来比较两个元素的函数指针参数是所比较两个元素指针当第一个元素小于第二个元素的时候返回一个< 0的值,当第

2022-03-30 23:28:26 110

原创 指针进阶---qsort函数的使用

qsort函数void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*));base – 指向要排序的数组的第一个元素的指针。nitems – 由 base 指向的数组中元素的个数。size – 数组中每个元素的大小,以字节为单位。compar– 用来比较两个元素的函数指针参数是所比较两个元素指针当第一个元素小于第二个元素的时候返回一个< 0的值,当第

2022-03-30 22:12:47 269

原创 指针进阶---回调函数

回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的实践或者条件发生时由另外一方调用,用于对该事件或条件进行响应。看个例子#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void print(const char* str) { printf("%s", str);}vo

2022-03-29 21:21:27 231

原创 指针进阶---函数指针数组

函数指针数组#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int Add(int a, int b) { return a + b;}int Sub(int a, int b) { return a - b;}int Mul(int a, int b) { return a * b;}int Dev(int a, int b) { return a / b;}int main() { //函数指针数组

2022-03-26 13:29:25 299

原创 指针进阶---函数指针

函数指针首先看一段代码找到函数的地址#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int Add(int a, int b) { return a + b;}int main() { int a = 2; int b = 3; printf("%p\n", Add); //005811C2 printf("%p\n", &Add); //005811C2 getchar(); return 0;}

2022-03-23 19:01:14 469

原创 指针进阶---数组传参

数组传参1 一维数组传参#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void test1(int arr[]) { return 0;}void test2(int arr[10]) { return 0;}void test3(int* parr) { return 0;}int main() { int arr[10] = { 0 }; test1(arr); test2(arr)

2022-03-18 00:23:50 250

原创 指针进阶---数组指针

数组指针直接看代码#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9.10 }; int(*p)[10] = &arr; //*p == arr,p == &arr int* pa = arr; // pa == arr char* arr1[5] = { 0 }; char* (*p1)[5] = &arr1

2022-03-17 12:53:33 129

原创 指针进阶---指针数组

指针数组一个基本用法#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 2,3,4,5,6 }; int arr3[] = { 3,4,5,6,7 }; int* parr[] = { arr1,arr2,arr3 }; int i = 0; for (i = 0; i < 3; i++) { int j

2022-03-17 11:02:09 346

原创 指针进阶---字符指针

字符指针主要有三种应用形式,下面通过代码进行说明1 用字符指针变量指向一个字符#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main() { char c = 'w'; char* pc = &c; printf("%c\n", *pc); return 0;}2 用字符指针变量指向字符数组的首地址#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.

2022-03-16 23:34:26 210

原创 结构体数组

结构体数组直接对比两个代码,分别进行结构体变量初始化,整体复制,以及修改变量1 这个代码是创建了两个结构体变量student1,student2#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>struct Stu { char name[20]; double height; char sex; char* talk;};void print(struct Stu* St

2022-03-16 22:45:37 202

原创 结构体传参

结构体传参首先看两个打印结构体数据的函数print1和print2#include<stdio.h>#include<string.h>struct Stu{ char name[20]; double height; char sex; char* talk;};void print1(struct Stu Str) { printf("name:%s\n", Str.name); printf("height:%f\n", Str.height);

2022-03-13 12:28:25 175

原创 结构体基础

结构体的定义结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。结构体声明struct tag { member - list;//成员变量}variable-list;//变量列表定义结构体变量定义这里用一种书举例子,成员变量有书名,价格,以及版本book1,book2,book3都是结构体类型变量,book4 是局部变量注意,结构体出来后只是变量类型,并没有申请内存空间,当其初始化后,会申请内存空间。struct Book { char name[20

2022-03-12 20:57:21 323

原创 浅谈“野指针”

野指针概念野指针就是指指针指向的位置是不可知的.野指针的主要形式1 指针未初始化,局部指针变量未初始化,默认为随机值#include<stdio.h>int main() { int* p;//指针变量未初始化 *p = 0; getchar(); return 0;}2 指针越界访问#include<stdio.h>int main() { int arr[10] = { 0 }; int i = 0; int* p = arr; for (

2022-03-10 21:37:17 148

原创 浅谈指针类型的作用

首先看一段代码#include <stdio.h>//指针就是变量,用来存放地址的变量int main() { int a = 0x11223344; int* pa = &a; char* pc = &a; printf("%p\n", pa); printf("%p\n", pc); getchar(); return 0; }运行结果为:可以看到int* 类型的变量pa,和char* 类型的变量pc都可以获取相同的地址,因为在32

2022-03-07 17:50:51 522

原创 C语言 二分法查找有序数组中的数

二分法查找有序数组中的数总体思路:将所查找的数字与数组的中间下标(mid)的元素进行对比,左下标为left,右下标为right,mid = (left + right)/2。刚开始当所查找的数字大于中间数字arr[mid]时,将right 设置为 mid-1 ,当查找的数字小于之间数字arr[mid]时,将left 设置为 mid+1。然后用更新的值再更新mid循环此操作,当left大于right时说明没有查询到此数字,结束循环。// 二分法查找有序数列中的某个数#define _CRT_SECU

2022-02-18 23:42:18 823

原创 开源的渗透工具—Sqlmap

Sqlmap介绍Sqlmap是一个开源的渗透工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。他有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层文件系统和通过带外连接在操作系统上执行命令官方网址:http://sqlmap.org/Sqlmap特点1 完全支持MySQL、Oracle、PostgreSQL、Mi...

2022-02-18 23:15:49 10122 1

原创 C++ float,double输出比较

浮点数,float,double输出比较

2022-01-13 00:05:17 1333

原创 SQL注入—sqli-labs-master , DVWA - master环境搭建

phpStudy下载与安装1 首先下载安装phpStudy,(官方网址:https://www.xp.cn/),下载完解压后,打开phpStudy,点击启动2 通过命令行 输入 ipconfig 获取本地的以太网IPv4地址3 在网站进行搜索IPv4的地址4 在pycharm中打开phpstudy—PHPTuorial—WWW—index.phpsqli-labs-maste ...

2020-02-20 15:19:21 808

原创 "黑暗"谷歌—shodan

shodan介绍信息收集方式1.主动信息收集:直接与目标进行交互,通过对交互过程中的信息进行收集2.被动信息收集:通过第三方引擎与目标交互,或不予目标交互查询数据库,获得目标的信息shodan搜索引擎介绍虽然目前人们都认为谷歌是最强的搜索引擎,但shodan才是互联网上最可怕的搜索引擎。与谷 歌不同的是,shodan不是在网上搜索网址,而是直接进入互联网的背后通道。shodan可以说是一...

2020-02-18 20:46:29 3369

原创 pip版本正确安装库失败的解决方案—换源安装

问题:在我安装shodan库的时候,升级完pip后安装还是失败可能是由于官方源下载速度慢,所以需要将源换成国内源,以提高下载速度。步骤如下:1 在 C:\Users\用户名 目录下创建pip文件夹2 在pip文件夹下面创建pip.ini文件(也可以现在桌面上先创建txt文件,进行第三步,然后再放入pip文件下,最后修改为ini文件。)3 写入[global]index-url...

2020-02-17 19:41:49 1042

原创 pip升级及升级失败的解决方案大全

1 按照系统提醒,使用python -m pip install --upgrade pip升级2 使用python -m pip install -U --force-reinstall pip 强制重新安装pip3 使用pip install --user --upgrade pip 使用管理员权限升级4 以上三种都失败的话,就说明服务器连接超时,使用命令python -m pip i...

2020-02-17 19:15:45 705

原创 信息收集

1 域名的介绍域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算组的名,用于在数据传输时标记计算机的电子方位在这里说一下浏览网站的过程:whoiswhois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商)。不同域名后缀的whois信息需要到不同的whois数据库查询。如.com的whois数据库...

2020-02-11 18:29:18 350

原创 kali虚拟机安装

1 首先是这个界面,我们先选择“创建新的虚拟机”2 选择 “自定义(高级)”,点击“下一步 ’3 选择”下一步“4 选择”稍后安装操作系统“,在选择”下一步“5 在这里我们选择 ”Linux(L)“,如果你的电脑是64位的,版本选择”Debian 6 64位(bit)“,否则选择”Debian 6 “(32 位)6 自己定义虚拟机的名称以及安装位置,建议不要装入C盘,选择完后点击...

2020-02-09 13:00:36 280

空空如也

空空如也

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

TA关注的人

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