自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单向链表如何快速找到中间位置,判断是否有环,如何求环长

用两个指针(post,swp)同时指在第一个节点,用一个指针(ptemp)向后走,如果找到一个数大于swp指的节点数据,就让swp指向这个新数据的节点,如此下去,直至走完,再比较post和swp是否相同,不相同就进行交换,下一次遍历让post指针指在第二个节点,从而完成排序。用两个指针,指向链表,一个指在第一个节点,一个指在第二个节点,两个指针同时向后走,比较大小且交换,再用第三个指针记录每次后一个指针的最终位置,下一次前一个指针走到这里就停止掉。9.若单向链表有环,如何求环入口;

2024-08-30 00:35:10 402

原创 如何处理段错误

如果找到段错误之后,要注意看一下这个地方是否存在内存泄漏问题,是否对超出定义空间的指针进行了操作,也就是野指针,是否没有释放内存,又或者说重复释放;调试代码时,遇到问题不要心慌,不要焦急,冷静来了,仔细分析是哪里的问题,不仅是对大家说,也是对我自己说,共勉!有一点,在使用 strcpy 时,一定要注意目的地址的空间一定要大于源地址的空间;2.在编译程序时,加入-g,(gcc main.c -g),生成core文件。3.如果产生段错误,使用gdb a.out core 查看段错误的具体信息,

2024-08-29 16:32:00 574

原创 如何将十六进制的乱码转换成汉字

可以看出,接收到的报文第一行包含了我们想要的信息,我们需要将。在TCP通信时,抓包得到的请求报文,我们需要对其进行分析,中心思想为:剔除%,用strtol将16进制乱码进行转换。

2024-08-28 21:39:09 2760

原创 从数据库中查找单词

首先使用access函数判断数据库字典有没有被创建,如果创建了就跳过创建这个步骤,要不然每次加载都会耗费很多时间(几乎1-2分钟)(等待的过程蛮漫长的);因为这个程序调用了sqlite3库,所以在编译时需要加上 -lsqlite3,要是每次都加可能比较麻烦,所以我们创建makefile文件;用strtok分割,第一次分割空格之前的单词,第二次分割到\r\n;我们知道,从文件中查找是一行一行的查找匹配,但是数据库就可以快速查找,节约时间;由于加载过程中太无聊,想要一点动态显示加载进度可以这样做,

2024-08-24 11:16:02 600

原创 数据库 —>数据库编程

id 后面的 intger 是id的类型,为整形,primary key 是一个约束,表示主键值,是唯一的,可以理解为给每次输入的内容从1开始的排序,asc 表示按升序排列,text表示文本字符串;为什么之前用perror打印出错信息,因为perror是调用系统函数,打印错误信息并将错误码置位,而sqlite3_exec中调用的是sqlite3中的库函数,需要自己从错误流中打印。文件掉电不会消失,一般用来存储软件配置,想要保存的东西,他在查找的时候是一行一行的去查找,效率不高;

2024-08-23 20:51:21 1536

原创 linux学习 第三十天(多路复用)

先将事件表的文件描述符都置位(-1),若有事件发生,添加该事件的文件描述符和events,监听事件,若有事件发生添加至新的events中,监听所有的文件描述符,(监听文件描述符的集合,有事发生时,select不再阻塞,留下产生事件的文件描述符)多路复用这里理解起来是有一点困难的,今天说一下select,poll,epoll,在多路复用中的使用及优缺点。2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销。类似于select的工作方式,监听文件描述符的集合;

2024-08-21 20:04:49 161

原创 Linux学习 第二十九天(阻塞IO,非阻塞IO,多路复用IO,异步IO)

举个例子:如果我们想在一个进程中既能从管道中读取数据,又能从终端读取数据,正常情况下,二者是不能同时进行的,因为会有一方一直在阻塞等待,导致程序不能继续下去,解决办法有两个,一个是创建线程,另一个就是我们要说到的设置非阻塞IO。我们平时用到的,fgets,scanf,recv,read,等函数接口都是会阻塞等待,当没有资源时,将任务挂起,等到拿到资源后继续向下执行,此时CPU占用率低。将一个文件描述符设定为异步IO,当IO有事件发生时,内核会向用户层发送SIGIO信号提醒用户层处理事件,

2024-08-21 00:00:01 170

原创 Linux学习 第二十八天 (TCP编程)

上次我们了UDP编程,今天我们说一下TCP编程;2.UDP资源开销小,实现机制简单。2.发送三次握手连接请求 (connect)3.监听,让三次握手排队等待(listen)1.不安全不可靠的传输方式。4.处理等待的套接字(accep)3.UDP是无连接的。1.创建套接字(socket)1.创建套接字(socket)5.关闭套接字(close)7.关闭(close)3.发送(send)4.接收(recv)2.绑定(bind)5.发送(send)6.接收(recv)

2024-08-16 19:37:18 237

原创 Linux学习 第二十七天 (网络编程)

物理层 (物理连接方式<光纤><网线><双绞线><WiFi><485总线><CAN总线><以太网>)TCP协议(传输控制协议)(过程可控制)(安全,三次握手建立连接)(机制复杂,资源开销大)UDP协议(用户数据报协议)(过程不可控)(不安全,不可靠)(机制简单,资源开销小)私有IP 192.168.0.0——192.168.255.255。FTP协议(文件传输协议)(可以文件共享)(基于TCP协议)主机位:子网掩码为0的部分, 局域网中的第几台主机 167。

2024-08-15 21:26:00 370

原创 Linux学习 第二十六天 (进程间通信:消息队列,共享内存,信号灯)

/SEM_UNDO 操作结束后,信号量的值会恢复到原来的值。//对信号量的操作 +1(释放信号量) -1(申请信号量)NULL: 让系统选择一个合适的地址映射到共享内存中。IPC_EXCL 如果存在就报错。IPC_CREAT:创建一个信号量数组。IPC_EXCL: 如果消息队列存在就报错。IPC_STAT:获取消息队列的信息。shmaddr:映射到共享内存中的地址。IPC_CREAT:创建一个消息队列。IPC_CREAT 创建。proj_id:项目ID(8bits)IPC_RMID 删除。

2024-08-15 01:04:21 552

原创 linux学习 第二十五天(进程间通信<信号>)

所谓异步,就是不知道对方啥时候发消息,所以不会阻塞等待,会执行自己的程序,如果收到对方消息才会执行相应程序;(2) 定时器alarm <间隔seconds秒后给进程发送SIGALRM信号>今天我们来说一下进程间通信的第二种方式:信号。信号是用户和内核之间进行通信的一种方式。(1) single <切换信号的处理方式>(3) kill <向进程发送信号>(1)可以从中端输入的信号。9号信号SIGKILL ——>进程结束。(2)9号和19号信号。19号信号SIGSTOP——>进程挂起。

2024-08-12 00:26:24 271

原创 linux学习 第二十四天(进程间通信<管道>)

可以看到在最后两次通信的时候,B发送hello,但是A除了接收到hello,还打印了别的东西,这个问题应该是由打开管道的权限影响(我的猜测,没改出来),我加油努力在搞搞,或许有高人可以指点一下!无名管道创建后,进程会拿到两个文件描述符来对管道进行操作,子进程创建时会拷贝父进程的内容,也会拿到这两个文件描述符,所以就可以通信啦。通过管道在文件系统中的路径找到管道名,两个进程以读写的方式打开同一管道,完成通信。管道,消息,信号,信号灯,队列,共享内存,套接字。子进程有独立的数据区,文本区,堆区,栈区,

2024-08-09 20:13:23 294

原创 linux学习 第二十二天(进程和线程)

waitpid可以指定回收某个子进程,未被回收的子进程会随着父进程的结束变成孤儿进程,最终被init回收。WNOHANG:非阻塞回收。利用当前的进程空间执行另外一份代码。pid:要回收的子进程的pid。wstatus:回收状态的指针。成功:返回回收的子进程的pid。1.进程中的waitpid和exec函数族。options:回收选项。回收指定的子进程空间。v:参数以指针数组形式传递。p:在系统目录下查找文件。l:参数以列表形式传递。

2024-08-07 20:17:52 230

原创 linux学习 第二十一天(进程)

进程:程序动态执行的过程。今天我们来说一下进程;程序:在磁盘空间的代码。1.进程相关的查看命令。

2024-08-06 19:30:57 203

原创 linux学习 第二十天(minishell工程文件)

Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。需要说明一点:我们在这里还添加了历史查看功能,输入history将会显示之前输入的命令记录。我们此次目标是自己编写一个minishell软件,可以完成shell的的基础功能。在实现chmod命令时,要注意将输入的字符串“0777”转换成八进制在进行判断!4.各部分功能的实现。

2024-08-05 18:42:38 285

原创 linux学习 第十九天(目录文件、链接文件)

软连接将文件a连接到文件b上,打开文件a对其进行的增删改操作就是对文件b进行的操作,如果删除掉文件b,文件a也会打不开,重新新建文件b,文件a又会和文件b连接上;硬链接其实是文件a和文件b同时操作一个数据,删掉文件b,文件a依然可以打开并操作,新建文件b,文件a和文件b的联系也会断掉;mode:目录文件的权限,一般写0777,将rwx对应转0,1换成八进制。2.操作目录文件时有三步,打开目录项,读取目录项,关闭目录项;之前讲了普通文件的操作,今天我们来说一下目录文件和链接文件;mode:目录文件的权限。

2024-08-02 19:40:11 267

原创 linux学习 第十八天

O_TRUNC 文件存在清0。O_EXCL 文件存在报错。O_ASYNC 异步IO。O_NONBLOCK 非阻塞。O_APPEND 追加。打开方式: O_CREAT 文件不存在创建。2.读写文件 fgetc fputc。读写文件:write read lseek。1.打开文件 fopen。3.关闭文件 fclose。今天来说下,文件IO和标准IO。关闭文件:close。

2024-08-01 19:26:35 182

原创 linux学习 第十七天

2.fscanf与fprintf。3.fwrite 和 fread。1.fgets与fputs。

2024-07-31 20:21:36 107

原创 linux学习 第十六天(操作系统的 shell命令 和 IO)

操作系统分为很多种,windows,macos,unix,linux,操作系统的作用是屏蔽底层不同硬件平台,我们用linux作为操作系统的原因有二:一是linux是开源且免费的,二是linux是可裁剪的;2.char c 字符设备文件 按字符扫描设备信息的文件。5.link l 链接文件 指向其他文件的文件。IO对文件进行操作,进行输入输出,linux系统的所有都是文件;打开文件-> 读写文件 ->关闭文件。_IOFBF 全缓存。

2024-07-30 18:30:33 285

原创 Linux学习 第十五天(内存管理和链表)

如果传入指针p的值,在函数体内对这个值进行修改,再去返回p的值,最终得到的是野指针,因为函数体内变量所占空间会在超出他作用域的时候进行回收,如果想修改p的地址,就传入p的指针;有头链表第一个节点是头,剩下的会被划分为两部分,数据区和地址区,数据区存放本节点的值,地址区存放下一个节点的地址;我们所知,程序员可操作的内存是堆区,若是我们操作不当,会造成内存泄漏,内存溢出,最终导致程序崩溃;链表分为单向链表(有头链表、无头链表)、双向链表、内核链表、循环链表;的逻辑顺序是通过链表中的。(1)数组和链表的区别。

2024-07-29 00:42:17 205

原创 Linux学习 第十四天(数据类型、位运算)

又称联合体,所有的变量存储在一个空间,空间大小以占空间最大的类型为准,前面变量的值会被后面变量的值覆盖掉,经常使用在传参,测试硬件平台是大端还是小端时;今天我们来说一下数据类型中的构造数据类型,还有位运算;有部分之前已经说过了,今天来重点说下所占内存;大端:低内存地址存放数据高位。小端:低内存地址存放数据低位。所以,这次取8个字节;

2024-07-26 20:13:52 204

原创 Linux学习 第十三天

数据类型分为基本数据类型和构造数据类型,构造数据类型又包括结构体、共用体、枚举。指针函数本质是一个函数,但是返回值是指针,不能返回局部变量的地址。结构体访问成员变量最终的类型由成员变量的类型决定。今天说一下指针函数和函数指针,还有结构体;本质上是一个指针,指向函数,占8字节空间,局部初始化(打点,未初始化的部分为0);1.补充一下指针数组和二维数组的内容。指针数组传参二级指针和长度。二维数组传参数组指针和长度。(->),结构体指针类型访问。(.),结构体变量类型访问。(2)结构体的初始化。

2024-07-25 19:27:34 202

原创 Linux 学习 第十二天(数组指针与指针数组)

二维数组是由一维数组构成的二维数组,a[2][3],可以理解为由两个一维数组构成,每个一维数组有3个元素,对二维数组名取地址后得到的数组指针指向a[0],再对&a取*时,数组指针由指向a[0]变成指向a[0][0],但是值不发生改变;&a == int (*)[5] //对数组名取地址,得到一个指针,类型为int*型;&int * == int ** // &运算符会让类型升级为int**型;指针数组本质上是一个数组,但是数组中的元素都为指针,经常用于操作字符型二维数组(字符串数组);

2024-07-24 18:44:34 226

原创 Linux学习 第十一天

虽然函数体操作外部传进来的吧数组和指针,都会改变外部数组和指针所指空间的值,这二者的不同之处在于,数组是存放数据的,指针是操作数据的;.封装一个函数传入一个整形数组和n,根据n对整形数组中的元素完成变换 int a[5] = {1, 2, 3, 4, 5};const修饰p和*p, 指针变量p的值不能变,也不能利用*p改变指向空间中的值, 一定要对指针初始化;数组和指针访问有如下关系:str[n] = p [n]= *(str +n) = *(p+n);数组的数组名是指向数组第一个元素的指针。

2024-07-23 19:39:58 210

原创 linux 学习 第十天

今天我们讲一下指针;

2024-07-22 19:45:00 94

原创 linux学习 第九天

形式1只能操作5个元素的数组,而形式二可以操作不同长度的数组,函数体内部的数会随着函数体的结束回收空间,若想继续操作必须在函数体外部接收,但是数组传递中形参和实参操作的是同一个数,这和指针有关;#include "stdio.h" 在当前目录下查找stdio.h,如果当前目录找不到则在系统目录/usr/include目录下查找头文件;当函数体想要使用函数体外部变量值的时候可以使用值传递,注意只能使用,而不能做修改;.h文件:.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。

2024-07-20 20:07:49 143

原创 Linux学习 第八天

今天学习了字符型二维数组,函数,变量的作用域,生命周期,存储;3.变量的作用域,生命周期,存储。

2024-07-19 21:43:46 170

原创 Linux学习 第七天

中心思想是将第一个的存储空间的下标定义为min,在双层for循环中将第一个值与后面的值分别比较,将最小值的下标定义为min,接着将最小值与第一个值交换位置(如果第一个值就是最小值,那么不做交换),如果输入5个值,则外层进行四次循环,从而实现从小到大的排序;今天有三部分内容,选择排序,二维整形数组,字符型数组;

2024-07-18 18:36:37 166

原创 linux学习 第六天

中心思想:将第一个元素和后面元素进行比较,逐次将大值放到最后一个,双层for循环,外面执行一次,里面执行一遍,len为数组中的元素个数,len=sizeof(a)/ sizeof(a[0]);其中心思想就是将数组的第一个赋给max,接着用max和每个元素比较,比max大就替换max中的值,最小值也同上;break一般用在循环语句或者switch语句中,用来跳出循环,当前循环语句中后续循环不执行;continue只能用在循环语句中,用来结束本次循环,当前循环语句中后续循环继续执行;有关数组概念如上图所示;

2024-07-17 19:09:32 403

原创 Linux学习 第五天

此时else后不可以跟逻辑表达式,if可以脱离else单独使用,但是else不能脱离if单独使用,语句用{},否则if只控制一句代码。case 常量2:语句块2;case 常量3:语句块3;do...while 先执行再判断,if,Switch,while,都是先判断再执行;用break来结束,没结束会继续向下执行,Switch只比较一次;case 常量1:switch (整形表达式2)case 常量1:语句块1;case 常量2:语句块2;case 常量3:语句块3;} while (逻辑表达式);

2024-07-16 19:15:27 471

原创 linux学习 第四天

今天是Linux学习的第四天,今天来讲一下C语言中常用的输入输出函数,流程控制,及两个简单例题。(1)从终端接收三角形三边的长,计算三角形的周长和面积?(2)从终端接收一个年份,判断该年是闰年还是平年?

2024-07-15 18:50:20 173

原创 Linux入门学习 第三天

变量的数据类型分为:short , int , long , char , float , double。不同的数据类型会有不同的存储,要根据使用情况分别对待。使用%f打印,操作浮点数时,double为默认数据类型。混合类型运算时会出现数据类型的精度转换,分为显示类型转换和隐式类型转换。使用%d打印,不做特殊说明的int一般为有符号整形。使用%c打印,使用时,默认为4字节。表达式一定有值 ,有类型。这里将浮点型的a转为整形的a,但是只转换一次,后面使用a时仍旧是浮点型的。

2024-07-13 18:47:55 433

原创 linux入门学习 第二天

error”无法生成可执行文件,“warning”已经生成可执行文件,但可能会出现错误。“hello\0”=='hello\0'+'\0', 有7个字符,这里\0为一个字符。关于Linux中gcc的编译,一般我们总是用“gcc hello.c”来生成可执行文件,但是它其实分为四步;比如: "a" == 'a' + '\0',实际上有2个字符。(2)需要注意的是,字符串型常量末尾有一个用来标识结尾的\0字符;‘0’字符零,值为48;代码执行后发生错误有两种,一种是语法错误,一种是逻辑错误。

2024-07-12 18:28:43 804

原创 linux学习入门

初学者的第一节课

2024-07-11 18:33:13 270 1

空空如也

空空如也

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

TA关注的人

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