自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zsm_bit的博客

掌握基础,逐步提升,小白也会飞

  • 博客(39)
  • 收藏
  • 关注

原创 小白飞起的起点

Hello!简单自我介绍下,我是一名来自“双非”一本大学的学生,当年高考成绩不如人愿,但已成事实,无可避免。上大学后,前两年,还算踏踏实实的度过,没有得过什么奖,但是参加了很多公益活动,结交了许多朋友,大小证书也算获得了几个。突然之间,就大三了,看着我身边的同学已经开始找实习了,我突然意识到自己的落后,于是我打算重拾起自己的兴趣之所在——编程,我希望通过编程之路可以激发起曾经的那个梦少年,为梦想仗...

2018-03-18 23:00:24 146

原创 HTTP协议的长连接和短连接

短连接在HTTP/1.0版本中,默认使用的是短连接,也就是说浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。如果客户端浏览器访问某个HTML或其他类型的Web页中包含其他的web资源,则浏览器每遇到这样一个web资源,就会建立一个HTTP会话长连接从HTTP/1.1版本起,默认使用长连接用以保持连接特性。使用长连接的HTTP协议,会在响应消息报文段加入...

2018-09-07 11:09:36 812

原创 TCP的粘包问题

今天,我们一起来探讨一下关于传输层TCP协议产生的粘包问题1、什么是粘包 ?      从接收缓冲区看,后一包的数据的头部紧接着前一包数据的尾部,使得接收方不能准确的读取一包数据,也就是接收方多读或少读一包数据所造成的现象就是粘包现象。       粘包只会在TCP的长连接https://blog.csdn.net/weixin_40123831/article/details/82493...

2018-09-07 11:03:48 197

原创 TCP/IP四层模型中的协议格式

TCP协议格式32位序号: 32位确认序号: 4位首部长度:表示TCP协议头的长度,以4字节为单位,因此TCP协议头最长可以是60个字节,如果没有选项字段,TCP协议头最短20个字节。 UGR(紧急):UGR=1表示紧急指针字段有效。它告诉系统此报文段有紧急数据,应当尽快传送。 ACK(确认):ACK=1时,确认号字段才有效。 PSH(推送):让对方立即收到响应。 RST(复位...

2018-09-07 08:50:55 968

原创 session和cookie的区别

1、什么是cookie和session?我们都知道,http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的。为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生。cookie是一种在客户端保存状态的方案,session是一种在服务器端保存状态的方案。2、cookie和session的区别 (举例说明)...

2018-09-07 08:32:31 252

原创 ncurses库的安装

ncurses库是一个Linux系统下的图形支持的函数库,字符终端处理库,包括面板和菜单。在虚拟机上成功安装ncurses库的过程如下:1、下载ncurses库源码压缩包大家可以去这个网址下载:http://ftp.gnu.org/pub/gnu/ncurses/     我选用的是ncurses-6.0版本2、将ncurses压缩包拷贝到我们的Linux主目录的bin文件夹下cp...

2018-09-07 08:24:21 12305 2

原创 文件压缩

本篇文章主要包含4个方面: 1.哈夫曼算法实现压缩的原理 2.具体压缩及解压过程思路阐述 3.项目中遇到的问题 4.项目扩展一、原理简述: huffman算法实现文件压缩的主要原理是通过huffman编码来重新表示字符,使得出现频率高的字符编码短,出现少的字符编码长。当用编码表示原文件时,总体的bit位时相对减少的。但当大部分字符出现的频率都差不多时,huffman压缩的压缩效率会很...

2018-09-02 17:05:13 264

原创 Web服务器

一、web框架原理图 如果服务器采用非CGI方式处理浏览器的请求,则直接返回浏览器请求的资源即可。采用CGI方式的话则要执行CGI程序: 二、多线程http服务器的工作方法 1.http/1.0版本采用的是短连接: 我们要搭建的是多线程服务器,并且使用短连接,所以每当建立一个连接之后,就创建一个线程去处理这个请求,并将这个线程设置成分离状态,然后主线程继续处于监听状态。当线程处理完这个请求...

2018-09-02 16:59:57 233

原创 继承

我们需要掌握以下知识点:1.什么是继承?2.继承权限和访问限定符3.在public继承权限下,理解赋值兼容规则4.继承中的作用域,理解什么是同名隐藏5.派生类的默认成员函数6.继承与友元7.继承与static静态变量8.继承体系下派生类的对象模型什么是继承呢?在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类”或者“父类...

2018-08-09 20:31:59 130

原创 进程控制详解

 关于进程创建、进程等待、进程终止:1.进程创建我们使用fork函数创建子进程,fork函数有两个返回值,一是父进程返回子进程pid,二是子进程返回0子进程和父进程代码共享,当父子进程有一方需要写入时,操作系统采用写时拷贝,单独开辟一份空间,以供写入,否则共享数据父子进程拥有独立的地址空间。关于fork和vfork的区别:vfork用于创建一个子进程,其子进程和父进程共...

2018-07-24 17:05:01 2240

原创 关于Linux进程那些事儿

 你了解进程吗?从用户的角度来看,进程是程序的一次动态执行过程;从内核的角度来看,进程是资源分配的基本单位,每个进程都有其独立的虚拟地址空间。那你知道如何管理一个进程吗?将一个进程管理起来,需要做以下两件事情:1.程序加载到内存中,先将进程描述起来,进程信息被放在一个叫做进程控制块的数据结构中,称为PCB,在Linux中,描述进程的PCB结构体叫做task_struct。...

2018-07-24 16:06:01 178

原创 Linux命令全家桶以及vim/gcc/gdb/makefile/yum

基本指令ls指令:对于目录,列出该目录下的所有子目录与文件;对于文件,列出文件名以及其他信息。ls -l //一行只输出一个文件pwd指令:显示当前用户所在目录cd指令:改变工作目录,将当前工作目录改变到指定目录下cd ..: 返回上级目录cd ~:进入用户家目录cd -:返回最近访问目录touch指令:新建一个不存在的文件  &&  更改文档或者目录的日期时间,包括存...

2018-07-15 17:23:26 461 1

原创 Linux简单指令以及vim、gcc、gdb

1.进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限. (1)进入目录需要可执行x的权限(2)cd 执行操作需要x权限 (展开此目录下内容)        touch 执行操作需要w,r,x三种权限 (创建一个文件)        ls 执行操作需要r,x两种权限(查看目录下内容)        rm 执行操作...

2018-06-14 15:30:40 4827

原创 时间复杂度 && 空间复杂度(详解)

       我们评估一种算法的优劣,可以使用它的时间复杂度和空间复杂度来衡量,当然,不作特殊说明,我们一般讨论的是该算法的最坏时间复杂度和最坏空间复杂度,即分析最坏情况以估算算法的执行时间的上界。在下面,我们会详细讨论关于斐波那契数列等函数实现的各种算法的时间复杂度和空间复杂度。时间复杂度我们一般采用大O渐进表示法描述一个算法的时间复杂度。时间复杂度主要讨论的是算法执行的次数。一般算法时间复杂度...

2018-05-29 15:51:27 19535 5

原创 单链表相关的面试题

SList.hvoid PrintListFromTail2Head(PNode pHead);//从尾到头打印单链表void EraseNotTailNode(PNode pos);//删除非尾结点void InsertFront(PNode pos,DataType data);//无头单链表插入结点void JosephCircle(PNode *ppHead,size_t M);//...

2018-05-29 15:05:27 148

原创 单链表

SList.h#include<stdlib.h>#include<stdio.h>typedef int DataType;typedef struct SListNode{ DataType _data; struct SListNode* _pNext;//指向下一个结点的指针}Node,*PNode;//////////////////////...

2018-05-29 14:57:46 153

原创 动态顺序表

SeqListD.h#pragma once#include<assert.h>#include<malloc.h>#include<stdio.h>#include<stdlib.h>#include<string.h>typedef int DataType;typedef struct SeqListD ...

2018-05-29 14:54:15 126

原创 静态顺序表

SeqList.h#pragma once//用来防止某个头文件被多次include#include<stdio.h>#include<assert.h>#include<malloc.h>#include<string.h>#define MAX_SIZE 10typedef int DataType;//静态顺序表type...

2018-05-29 14:44:19 115

原创 mem系列函数

memcpy:void *memcpy(char *dest, const char *src, int count){ void *ret = dest; while (count--) { *(char *)dest = *(char *)src; ++(char *)dest; ++(char *)src; } return ret;}memmove:void *m...

2018-05-18 07:16:19 534

原创 str系列字符串函数

int strlen(const char *str)--->求字符串长度的函数char *strcpy(char *dest,char *src)--->字符串拷贝char *strcat(char *dest,char *src)--->字符串连接char *strstr(const char *str1,const char *str2)--->字符串的查找(查...

2018-05-18 07:14:40 489

原创 函数递归(总结)

什么是递归?程序调用自身的编程技巧称为递归。递归的主要思考方式在于:把大事化小递归的两个必要条件:(1)跳出条件:存在限制条件,当满足这个限制条件时,递归便不再继续(2)限制条件:每次递归调用之后越来越接近这个限制条件。来看几组练习,看看递归是如何实现的?----->1.//接受一个整形值(无符号),把它转换成字符并打印它//输入1234 输出 1 2 3 4 void print(in...

2018-05-10 10:39:53 242

原创 动态内存分配

为什么使用动态内存分配?数据的元素存储于内存中连续的位置上,当一个数组被声明时,它所需要的内存在编译时就被分配,但是,我们可以使用动态内存分配在运行时为它分配内存。当我们声明数组时,必须用一个编译时常量指定数组的长度,但是,数组的长度常常在运行时我们知道,因为它所需要的内存空间取决于输入数据,说到这里,相信你已经明白了,如果内存在编译时就被分配的缺点了。因此,我们必须熟练使用动态内存分配来解决这个...

2018-05-09 19:43:30 155

原创 自定义类型:结构体,枚举,联合的知识小结

结构体:我们通常所见数据大多成组出现,即它们的数据类型相同,但是如果数据类型不同怎么办?例如,描述一个学生的信息,包含姓名,年龄,性别等,它们数据类型不同,无法存储于同一个数组中,在C语言中,我们可以通过使用结构把不同类型的值存储在一起。结构体声明举例代码如下:struct Stu{ char name[20]; int age; char id[15];};//注意:分号不能丢结构体成...

2018-05-09 15:29:16 134

原创 使用c语言实现一个简易的通讯录

2.实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 实现方法非常简单,只要按部就班的做,就一定可以实现,加油咯!Contact.h#ifndef __CO...

2018-05-09 14:21:25 2930

原创 函数指针数组和函数指针数组的指针

函数指针数组回顾一下:char *(*pf)(char *p);//函数指针上面代码表示定义的是一个函数指针pf,pf是一个指针变量,那么,pf就可以存储在以个数组里面。如下:char *(*pf[3])(char *p);//函数指针数组上述代码定义的是一个函数指针数组,它是 一个数组,数组名为pf,数组内存储了3个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针,参数为一个指向字符的...

2018-05-01 11:45:53 371

原创 详解指针数组,数组指针,函数指针

指针和数组的对比:指针数组和数组指针:要理解这几个概念,就要明白:好孩子,首先他是个孩子。指针数组:就是指针的数组,也就是说它实质上是一个数组,只是数组的每个元素都是指针,至于数组占多少个字节由数组本身决定。它是存储指针的数组的简称。例如:int *p1[10];//指针数组解释上面代码:由于"[]"优先级要比''*''的优先级高,所以p1先和“[]"结合,构成数组的定义,数组名为p1,int*修...

2018-05-01 11:39:44 157

原创 函数的调用过程(栈帧)

试看下面的代码是如何进行函数调用的?测试环境:VC++ 6.0#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int Add(int x, int y){ int z = 0; z = x + y; return z;}int main(){ int a = 10; int b = 20; int ret =...

2018-04-19 11:07:12 163

原创 可变参数列表源码的剖析

c语言有时会遇到一些参数可变的函数,如printf(),这些函数内部的参数列表是可变的。printf()函数原型:int printf(const char *format,...) printf()函数是以一个支持可变参数的函数,可以有多个参数,除了format以外,后面跟着的参数的个数和类型是可变的,用…作为一种占位符号。“…”称为可变参数列表,可以用来接受个数和类型不确定的参数。可变参数列表...

2018-04-19 09:07:40 139

原创 linux初级入门知识

linux操作系统程序环境和预处理编译分为三个预处理(也叫预编译),编译,汇编预处理test.cgcc -E test.c 作用:1头文件包含(以#开头的为预处理指令) 2注释删除 3#define定义符号的替换编译gcc -S test.i 作用:1把源代码编程汇编代码 2进行语法检测(分析),词法分析,语义分析,符号汇总汇编gcc -o test.o 作用:把汇编代码转换成二进制指令,形成符号...

2018-04-10 21:11:06 165

原创 三子棋小游戏的实现

game.h#ifndef __GAME_H__ #define __GAME_H__ #include <string.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #define ROW 3 #define COL 3 void Init...

2018-04-10 16:59:18 267

原创 扫雷游戏的实现

game.h#define ROW (ROWS-2) #define MAX 10 //雷的个数 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h>//memset头文件 void init_board(char mine[RO...

2018-04-10 16:51:22 678

原创 C语言操作符(总结)

操作符的分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用/函数调用和结构成员。1.算术操作符:+  : 加法  - :减法* :乘法/ :除法   ——操作数中两个都为整型则为整数除法,只要有一个操作数为浮点数则为浮点数除法。%:取模   —— 操作数必须为整型,返回的是整除之后的余数。2.移位操作符<<:左移位---左边丢弃,右边...

2018-03-31 12:47:24 217

原创 将三个数按从大到小输出

//4.将三个数按从大到小输出#include<stdio.h>int main(){ int i = 2; int j = 3; int k = 5; int temp = 0; if (i < j) { temp = i; i= j; j = temp; } if (i < k) { temp = i; i = k; k ...

2018-03-20 23:12:05 211

原创 求10 个整数中最大值

//求10 个整数中最大值#include<stdio.h>int main(){ int arr[] = { 2, 5, 9, 6, 15, 24, 16, 35, 36, 66 }; int i = 0; int max = arr[0]; for (i = 0; i < 10; i++) { if (arr[i] > max) { max...

2018-03-20 22:57:25 171

原创 不允许创建临时变量,交换两个数的内容(附加题)

// 不允许创建临时变量,交换两个数的内容(附加题)//算法:利用基本赋值语句完成交换操作#include<stdio.h>int main(){ int i = 3; int j = 2; i = i + j;//i=3+2=5 j = i - j;//j=5-2=3 i = i - j;//i=5-3=2 printf("交换后i=%d,j=%d\n", i, ...

2018-03-20 22:44:08 353

原创 给定两个整形变量的值,将两个值的内容进行交换。

//给定两个整形变量的值,将两个值的内容进行交换。//创建一个临时变量,将两个值进行交换#include<stdio.h>int main(){ int i = 10; int j = 20; int temp = 0; temp = i; i = j; j = temp; printf("%d,%d",i,j); printf("\n"); system("...

2018-03-20 22:22:32 144

原创 判断1000年---2000年之间的闰年

#include<stdio.h>int main(){ int count = 0; int year = 0; for (year = 1000; year <= 2000; year++) { if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) { ...

2018-03-20 08:40:33 308

原创 输出乘法口诀表

#include<stdio.h>#include<stdlib.h>int main(){ int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%2d ",i, j, i*j); } printf("\n"); } s...

2018-03-20 08:38:56 134

原创 打印100~200 之间的素数

#include<stdio.h> #include<math.h> #include<stdlib.h> int main() { int i = 0; int count = 0; for (i = 101; i <= 200; i = i + 2) { int j = 0; for (j = 2; j &...

2018-03-20 08:35:21 119

空空如也

空空如也

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

TA关注的人

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