自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于单进程、多进程、孤儿进程的几种TCP服务器的C语言写法

几种不同类型的TCP服务器都包含相同的头文件,但是并不是每个头文件都是.c文件所必须的。

2024-06-14 11:30:08 310

原创 一些常见的终端和vim操作

alt+. : 粘贴最后一次命令最后的参数(通常用于‘mkdir long-long-dir’之后,‘cd’配合着‘alt+.’)ctrl+v,hjkl,shift+i,esc : 列操作,r替换、c删除并编辑、x删除。ctrl+shift+c : 复制(相当于鼠标左键拖拽,鼠标先选中)ctrl+h : 删除光标前一个字符(相当于backspace)ctrl+d : 删除光标后一个字符(相当于delete)ctrl+shift+v : 粘贴(相当于鼠标中键)ctrl+f : 后移一个字符(forward)

2024-06-13 15:32:16 161

原创 C语言文件读写

第一个buffer参数是存储读取数据的指针,第二个size参数是读取每个数据项的字节数,第三个参数count是要读取的数据项的个数,第四个参数stream是要读取文件的指针。第一个参数ptr是要获取的数据地址,第二个参数size是要写入内容的单字节数,第三个nmemb参数是要写入size字节数的数据项的额个数,第四个参数stream是目标文件指针。第一个stream参数是要读取文件的文件指针,第二个format参数是要读取的字符格式,第三个参数是要读取的各个输入。成功返回读入参数的个数,失败返回EOF。

2024-06-08 20:14:34 885

原创 字符串处理

如果在str指向的字符串中发现了delim字符串中的字符,就将其变成'\0',调用一次strtok就只切割一次,切割过后,再去切割就要把strtok的第一个参数传入NULL,意思是继续上一次的切割位置继续切割。在haystack指向的字符串中查找needle指向的字符串,如果haystack指向的字符串有多个needle指向的字符串,则找的是第一个。在字符指针s所指向的字符串中查找ascii码为c的字符,如果s指向的字符串中有多个acsii为c的字符,则找的是第一个。参数s是要复制的字符串指针。

2024-06-07 09:59:47 457

原创 C语言内存分配

在堆上分配内存:malloc() calloc() realloc() 和 free()

2024-06-05 16:57:02 274

原创 c++stack&queue

用less定义一个对象,对象调用operator()的时候就像是函数调用,所以称为仿函数。优先级队列的排序方式其实是堆排序,但是怎么控制建大堆还是建小堆呢?在priority_queue类中增加模板参数。上面的函数大体上实现了库中的优先级队列。用类重载(),行成仿函数。

2023-05-29 20:12:47 123

原创 c++之list模拟实现

【代码】c++之list模拟实现。

2023-05-22 18:45:50 126

原创 c++之vector模拟实现与迭代器失效问题

实际上是新开了一块空间,将原空间释放,再将内容拷贝到_start里,那么就会导致传入的pos指针失效了,因为他原本指向的空间已经被释放了,这时候的POS就变成了野指针,这类问题在vector中我们称之为迭代器失效问题。这只是迭代器失效的一种普通的情况,在实际的vector中,迭代器失效的情况可能偶有发生,主要还是用户对vector指针进行了不当的操作。因此在insert函数中,我们设置了len变量来记录POS的位置,并且在扩容后进行更新。

2023-05-09 21:32:44 112

原创 c++之string类的模拟实现

【代码】c++之string类的模拟实现。

2023-05-04 13:30:52 72

原创 c++模板

如果有这样一种情况,多个不同类型的参数需要调用Swap函数怎么办?我们需要把所有类型的函数重载都写上吗?模板类型不支持隐式类型转换,因为在推演过程就报错了,隐式类型转换发生在传参的过程中。可以看到在cplusplus中,c++库的swap函数也是这样构造的。编译器会帮助我们实例化推演生成对应的函数。还可以用多个虚拟类型来解决这个问题。模板不支持两个文件声明和定义分离。编译器调用的实际上是不同的函数。

2023-04-27 18:51:52 60

原创 c++内存管理

因为malloc开辟空间失败会返回空,不符合new的返回机制,所以operator new封装了malloc,失败的时候进行抛异常。可以看到在反汇编界面,new关键字调用了operator new 与A类的构造函数,operator new是new的重载吗?operator new 其实也是调用的malloc,那为什么不直接调用malloc?对于内置类型,new与malloc并没有本质的区别,只是写法上更加的简便。首先c++是兼容c语言的,c语言的管理方式在c++中是可以使用的。

2023-04-27 11:11:51 59

原创 c++之类和对象3

static 修饰的成员函数叫做静态成员函数,静态成员函数没有this指针,只能访问静态成员变量,但非静态成员函数可以访问静态成员变量。用static修饰的成员变量叫做静态成员变量,静态成员变量被整个类所拥有,不属于某个对象,存储在静态区。5.1友元函数可以访问类的私有成员,他是定义在类外面的函数,友元函数的声明需要用到friend关键字。使用初始化列表对没有默认构造函数的自定义类型初始化,实际上初始化列表就是调用的自定义类型的构造函数。静态成员变量必须在类外面定义,因为静态成员变量不存在于初始化列表中。

2023-04-26 19:17:26 28

原创 c++类和对象2

比如:日期类就不需要我们显示的写析构函数,因为当函数结束时栈会自动销毁,日期类定义的变量都会被销毁,但是栈类就需要我们写析构函数,因为栈中有动态开辟的内存空间需要手动释放。5.如果用户不显示定义构造函数,编译器会自动生成一个无参的默认构造函数,如果用户定义了,编译器就不再生成。析构函数与构造函数的功能相反,对象在销毁时会调用析构函数,完成对资源的清理工作。默认生成的拷贝构造,对内置类型按照字节直接拷贝,对自定义类型调用他的拷贝构造函数。内置类型不处理,自定义类型调用他的默认析构函数。

2023-04-25 15:22:43 65

原创 mysql之表操作

(这里的表操作主要讲的是对表本身属性的修改如创建,修改名字等,并不会对表的数据进行操作)

2023-04-24 16:32:16 100

原创 数据库与mysql之基本库操作

(我使用的数据库是在内核版本为centos7的云服务器上部署的,云服务器部署mysql比较麻烦,如果有人有需要,可以私信或评论,我可以出一个教程)

2023-04-14 08:56:11 113 1

原创 c++之类和对象1

我们注意到:c++中的类有访问限定符定义一个简单的日期类,class关键字定义的类默认类的成员是私有的,在类外面无法访问;而struct定义的类默认成员是共有的,因为c++的struct要兼容c语言struct的用法。如果成员函数在类中定义,编译器可能会把函数当成内联函数处理;如果声明和定义分离,在定义的时候,成员函数要加上域名。

2023-04-11 14:36:04 59

原创 Linux操作系统之进程

1)Linux操作系统可以同时加载多个进程,哪操作系统怎么管理进程?先描述!再组织!想要管理一个进程,首先要得到这个进程的状态,这就是描述进程。那我们平时在c语言中是怎么描述一个对象的呢?int age;int weight;int height;在c语言中我们用这样一个结构体来描述一个学生对象,在Linux中同样如此。(Linux的底层实现使用的是c语言)Linux操作系统中用类似于上面的PCB结构体描述每一个进程2)PCB结构体中包含了进程的什么属性?

2023-04-03 22:26:09 95

原创 c++基础3

3)inline不建议声明和定义分开,因为如果编译器在函数调用的地方将声明展开,就不会生成函数地址,链接的时候找不到函数的定义。在c++中用inline修饰的函数就是内联函数,c++编译器编译时会在调用内敛函数的地方展开,没有压栈的开销。当函数代码行数较少(1-10)或被频繁调用(10W次)的时候,在调用的地方展开会大大减小开销。2)inlin对编译器来说只是一个建议,编译器会根据自己的编译规则来决定是否展开。在c语言的语法中 NULL定义为0这就导致了类型问题。1)auto不能作为函数的参数类型。

2023-04-02 16:24:53 53

原创 Linux操作系统之gdb

同样可以用readelf指令查看debug信息,mytest并没有debug文件,而mytest-debug则有。list或l打印代码(gdb会默认记录上一条命令,如果不输入语句直接回车,就会默认执行上一条命令)b 行号 在指定行添加断点(如果改行没有代码则自动将断点设置到最近的位置)使用-g选项生成debug版本,可以看到两个版本的大小差别。disable 断点编号 关闭断点但是不删除断点。r重新开始调试,如果没有设置断点,则运行知道程序结束。这样得到的文件可以用gdb进行调试吗?

2023-04-01 16:58:59 149

原创 Linux操作系统之yum、git

这时我们需要git pull同步仓库信息,如果git pull后弹出报错信息,不需要理会,退出报错后,重新上传即可。vim打开这个文件,其中出现的后缀,以这些为后缀的文件不会被上传,我们同样可以修改这些文件。在本地仓库中,会有一个.gitignore隐藏文件,这个文件表示你想默认忽略上传的文件。删除之后,再进行一次上传文件,因为删除操作本质上也是一次新增或修改文件。进入仓库目录,添加文件,这里的 . 表示将当前本地目录所有新增文件上传。当你clone完成后,会在当前路径下生成你的仓库目录。

2023-03-31 09:40:21 148 1

原创 c++基础2

但是不可以有const int 传化成int,即权限只能平移或缩小,但是不能放大。可以看到,在Linux下,c++的函数名由函数名和参数类型的首字母构成,在编译之后两个函数名相同的函数就变成了不同的函数。做返回值类型的时候,如果返回值在函数结束后被销毁,需要用传值返回拷贝值,当数据没有被销毁的时候,才可以用引用返回。在Linux上写下一段简单的程序,观察他在gcc与g++下,函数命名的区别。3、在不带哨兵卫头结点的单链表操作中,可以避免二级指针,直接传引用。3、一个引用只能有一个实体,在定义之后不能更改。

2023-03-29 18:53:19 53

原创 c++基础

c++支持在函数定义或声明的时候,给形参一个初始值,如果函数调用的时候不给形参传参数,那么形参默认是初始值。同一个工程中允许存在多个名字相同的命名空间,在编译器编译时,会将他们合并。缺省参数不能在声明和定义中同时出现,如果在多项目中,可以再声明中缺省参数。全缺省参数,函数调用的时候,赋值需要从左往右依次赋值。在c语言中编译这样一段代码的时候,就会出现如下错误。c++中将标准库的命名都放到std的命名空间里。半缺省的时候,缺省参数需要从右向左给缺省值。于是c++中产生了命名空间。缺省参数支持全缺省和半缺省。

2023-03-28 18:55:20 34

原创 Linux操作系统之简单进度条

键盘与显示的输入与输出都会先存储在缓冲区里,根据特定的刷新策略进行刷新。当执行如下代码时,hello bit会在一秒钟后打印出来。回车:回到本行的最开始 \r。换行:切换到下一行的当前位置。

2023-03-27 19:48:23 62 1

原创 Linux操作系统之gcc/g++

当我一直执行make时:可以看到,第一次执行make后,行成的可执行程序已经是最新的了,就不会再执行make但当我一直执行make clean的时候:make clean一直可以被执行,所以叫做总是被执行的如果想要make一直被执行,同样可以用.PHONY修饰mytest。

2023-03-27 19:45:17 564

原创 Linux操作系统之vim环境配置

但是other的所有权限都打开时,任何用户可以在公共目录下进行创建删除等操作,哪怕是别人创建的文件,我虽然没有权限访问,但是我可以删除,因为目录下的文件可不可以删除不是有文件决定的,而是由目录的权限决定的。当我以普通用户登录时,可以看到根目录下,有一个tmp的公共目录,公共目录的所属组与所有者都是root,其他用户都是以other来进行访问。创建目录时,拥有者和所属组的权限在umask中值为0,所以不会发生改变,但是other的权限发生了改变。那为什么我们创建出来的文件或目录的权限是这样?

2023-03-07 22:07:27 803

原创 Linux系统之权限操作

root用户是超级用户,基本上不受权限的限制,同样root用户可以切换到任意用户或修改任意用户的密码,普通用户切换到root用户需要输入root密码。sudo命令可以短暂提升用户权限,使普通用户获得root用户的权限,但是普通用户若想使用这条命令,需要root用户将普通用户添加到信用列表。一个文件如果不具备相应的权限,就不能执行相应的工作,但是具备了某一项权限,也不一定能执行。当所属组与所有者是同一人时,所有者的权限优先,即能不能对文件进行操作,只看所有者有没有权限,不看所属组有没有权限。

2023-03-06 21:57:15 172

原创 Linux操作系统之文件基本操作

一般情况下,echo将输出结果通过管道传给head、ls或其他命令时,其他命令或默认读取管道输出结果,但加上xargs后,其他命令会把管道输出结果当成参数读取。方法二:使用管道 | ,将head的结果通过管道,直接输出到tail指令中,这种方法不用创建文件,属于内存级别的传输,当临时文件较大时,更快。head与tail命令同样支持-n选项,打印需要的行数,同时还可以相互配合,直接输出文本行需要的中间位置。more不支持上下翻看。解压时不添加路径的情况下,默认解压到当前目录,此时不需要-d选项。

2023-03-05 22:27:04 292

原创 os与Linux之Linux基本操作指令

echo本来只是将“hello world”打印到显示器上,加入了>后,echo在没有file.c文件的情况下,创建了file.c文件并将“hello world”输出到file.c文件中,其中 > 称之为输出重定向。可以看到,rm命令删除code文件夹的时候失败了,当删除文件夹时,还需要用到 -r 与 -f 选项,其中 -r选项表示递归删除,-f选项表示强制删除,当加上-f选项之后不需要像上图一样输入y或n来确定是否删除。cp命令用来拷复制文件或目录,格式为cp 源文件或目录 目标文件或目录。

2023-03-04 23:30:00 326

原创 c语言之do、while;goto语句

随意的goto跳跃,会导致程序产生不可控的影响,如上所示,便形成了一个死循环,不过在多层循环嵌套中,goto的使用有时候优于break。多层循环嵌套中,最内层循环使用break智能跳出一层循环,而goto可以跳出所有循环,但是goto不能跨函数使用。break、continue在do、while循环中的使用与在while、for循环中的使用效果一样。与for、while循环比起来,do、while循环初次进入循环时,首先执行循环语句,再进行判断。c语言中,goto语句提供了依靠表示符的随意跳跃的可能性。

2023-03-03 17:50:22 238

原创 c语言之for、while循环

可以看到当把break换成continue的时候,循环的执行结果打印了1-4&6-10,当n=5的时候,continue跳过了循环中在他之后的语句,即continue会终结本次循环,直接转跳到循环的判断语句。注意:当我把break换成continue的时候,我把n++语句提前了,这是因为如果n++在continue之后的话,当n=5时,会跳过变量调整阶段,n每次进行判断的时候都是5,从而产生死循环。原本是打印0-9的循环,当n=5时,进行了break操作,从而跳出了循环。while(判断语句)

2023-03-02 20:24:45 386

原创 c语言之if switch判断语句

另外if语句默认执行接下来的一条语句,如果if语句接下来要执行多条语句,需要用{}将多条语句全部包括在内,如上图所示。注:c语言规定,0为假,1为真(-1为真)if语句使用方法:if(判断条件)printf("输入错误\n");printf("星期一\n");printf("星期二\n");printf("星期三\n");printf("星期四\n");printf("星期五\n");printf("星期天\n");printf("青年\n");printf("其他\n");

2023-03-02 17:59:44 176

原创 【c语言-从头开始】

c语言,从零开始

2022-01-16 09:31:36 331

空空如也

空空如也

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

TA关注的人

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