自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 NoSQL简介

NoSQL用户个人信息,社交网络、地理位置。用户自己的文件增长。NoSQL可以处理以上情况。NoSQL(Not Only SQL)泛指非关系型数据库,随着Web2.0互联网的诞生,传统的关系数据库很难解决。关系数据库:行、列、表流数据类型不需要固定的格式,不需要多余的操作就可以横向扩展NoSQL特点方便扩展(数据之间没有关系,解耦,即数据之间没有耦合性,利用解耦可以方便操作)大数据量高性能(redis每秒读11万次,写8万次,NoSQL的缓存是一种细粒度的缓存)多样的数据类

2021-12-22 18:13:15 1322

原创 分组密码总结

分组密码分组密码就是将明文消息序列划分成长为n的组,各组分别在密钥k控制下,变成等长的输出序列。代换: 明文分组到密文分组的可逆变换为代换。扩散和混淆: 扩散和混淆是Shannonon提出的设计密码系统的两个基本方法,目的是抗击敌手对密码系统的统计分析。扩散是将明文的统计特性散布到密文中,使密文中的每一位由明文中多位产生。混淆是使密文和密钥之间的统计关系变得尽可能的复杂,使敌手无法获得密钥。Feistel密码结构很多分组密码的本质是Feistel结构。是一种代换-置换网络。其结构如下如图,

2021-12-15 17:49:06 5144

原创 哈希算法介绍

哈希算法哈希函数:在密码学中,哈希函数H是一个公开函数,用于将任意长的消息M映射为较短的、固定长度一个值H(M),作为认证符,称函数值H(M)为哈希值或哈希码或消息摘要。哈希函数的安全性要求给定数据容易计算出哈希值,但给定哈希值不能计算出数据。哈希码提供了一种错误检测能力。使用哈希函数提供消息认证有6种基本使用方式:(1)消息与哈希码链接后用单钥加密算法加密(2)用单钥加密算法仅对哈希码加密(3)用公钥加密算法和发方的秘密钥仅加密哈希码,这种方法提供了数字签名(4)消息的哈希码值用公钥加密算

2021-12-12 16:15:34 1623

原创 流密码简介

流密码单钥密码分为流密码和分组密码。流密码的概念: 利用秘钥k产生一个密钥流z=z0z1…,c=c0c1c2…=Ez0(m0)Ez1(m1)…。密钥流由密钥流发生器f产生:zi=f(k, oi),oi是加密器中记忆元件在时刻i的状态。分组密码与流密码的区别就在于有无记忆。oi可能依赖于k, o0, m0, m1…mi-1等。同步流密码: 根据状态oi是否依赖于输入的明文字符,流密码可以分为oi独立于明文字符的同步流密码,和另外的自同步流密码。有限状态自动机: 有限状态自动机是一个数学模型,可分为以

2021-12-12 11:42:22 4196

原创 密码体制等密码学基本概念

密码体制等密码学基本概念保密通信系统保密通信系统模型: 包括明文空间(M,信源)、密文空间©、加密秘钥(K1)、解密秘钥(K2)、加密算法(E)、解密算法(D)构成。保密系统需满足的要求:保密系统虽然达不到理论上的不可破,至少也应该是实际上的不可破。Kerckhoff原则:系统的保密性不依赖于对加密体制或是算法的保密,而是依赖于秘钥的保密。加解密算法适用于秘钥空间的所有秘钥。便于实现和使用。密码体制分类密码体制可以分为单钥体制和双钥体制。单钥体制: 加解密秘钥相同。单钥体制又可

2021-12-11 17:54:38 4818

原创 哈希表简介

哈希表概念:哈希表是用来存储键值对的,可以平衡时间和空间的数据结构,用空间来换空间。当键是整数时,可以用无序数组来实现哈希表。哈希函数:要将键映射到存储的下标(地址),就需要一个函数,这就是哈希函数的功能。哈希冲突处理:使用哈希函数时,很多时候存在将多个键映射到同一个下标(地址)的情况,这就产生了冲突,此时就需要处理哈希冲突。Hash函数构造方法:直接定址法:直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址数字分析法:从中提取分布均匀的若干位或它们的

2021-12-07 21:26:13 151

原创 C++软件开发面试题整理

1.指针和引用的区别:(1)引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。(2)引用初始化后不能被改变,指针可以改变所指的对象。(3)不存在指向空值的引用,但是存在指向空值的指针。(4)可以有多级指针,但没有多级引用。2.虚函数和纯虚函数的区别:1、类如果声明了虚函数,这个函数是实现了的,即使是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用动态绑定来达到多态的目的(即父类指针指向子类对象,调用子类方法)。而纯虚函数只

2021-10-23 17:58:20 652

原创 线程的概念以及为什么要引入线程

线程的概念以及为什么要引入线程文章目录线程的概念以及为什么要引入线程1.线程2.为什么要引入线程1.线程线程是轻量级的进程,在一个进程内部可以存在一个或多个线程,进程与进程之间是不能共享内存的,进程之间的消息通信不方便,但是一个进程内部的线程之间是共享这个进程的内存空间的,线程之间通信很方便。2.为什么要引入线程如以上讲的,线程之间共享内存。比如,一个文字输入软件,其内部可以有三个线程,一个用来响应鼠标、键盘的交互线程,一个用来运算,另一个用来备份。因为进程之间不共享内存,所以不能用多个进程来实现

2021-10-04 18:35:05 6292

原创 简单的shell原理以及实现

简单的shell原理以及实现文章目录简单的shell原理以及实现shell原理简单的shell实现shell原理首先在用户层面,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。execve()系统调用被定义在unistd.h,它的原型如下int execve(const char *filename, char *const argv[], char *cons

2021-09-29 09:40:29 587

原创 操作系统的一点零碎知识

操作系统的一点零碎知识文章目录操作系统的一点零碎知识PSW: 程序状态字寄存器,用来保存CPU的优先级,CPU的模式(用户态还是内核态),条件码位以及一些其它控制信息。用户程序在用户态下运行,用户态下有关I/O、硬件和内存保护的指令都是被禁止的,当然,将PSW中的CPU模式设置为内核态也是被禁止的。用户态想要获得这些服务,必须使用系统调用陷入内核以调用操作系统,TRAP指令就是把用户态切换到内核态,并启用操作系统。程序的异常,有些事硬件引起的,异常情况下,操作系统都要获得控制权,操作系统决定异常如

2021-09-28 12:28:52 85

原创 C静态变量

静态变量在第一次创建时产生,它的作用范围是整个程序,静态变量的值可以被改变(常量静态变量除外),值被改变后作用于整个程序,静态变量直到main函数结束后才被销毁,静态变量存储在数据段,不赋值时存储在.bss段,.bss段也可以看作是数据段的一部分。静态变量在main函数结束以后才销毁的原理是:程序中存在一个.finit段,该段的内容在main函数结束以后才会执行,将需要在main函数结束后才销毁的内容放在这个段可以实现。...

2021-09-27 23:18:56 293

原创 多文件程序的静态链接

多文件程序的静态链接文章目录多文件程序的静态链接1.按序叠加2.相似段合并对于多文件的程序,或者需要链接到其它程序运行的代码,两者之间的链接,这就是静态链接。首先,各文件单独编译为.o的目标文件,再通过静态链接为可执行文件,但问题是怎么链接,文件之间的空间与地址怎么分配?1.按序叠加按序叠加就是将各文件的内容按顺序在内存中存储,但是这会出现一个问题是:各文件中分为数据段、代码段等,如果一个规模稍大的应用程序可能有几百目标文件,就存在几百上千个段,由于各段在内存中存储是需要按照要求对齐,这样就会出现很

2021-09-25 15:38:09 157

原创 《C++ Primer》学习

《C++ Primer》这本书比较厚,讲的内容也很详细,相当是学习C++的字典,内容全面而且易懂,对于C++初学者,有一定C++基础的人来说比较友好,但是如果对于C++初学者来说,想要首先了解C++大致的内容可以选择一些高校用的教材之类的书籍,可以大概了解C++的内容之后,在读《C++ Primer》。因为这本书内容很多,难以在有限时间内了解C++的大致内容,所以可以有一定基础之后再读这本书,全面的了解C++,这本书基本上就是字典,平时可以用来查阅相关知识。这本书对于C++来说,我还是比较推荐的,是学习C

2021-09-25 15:00:14 104

原创 《图解HTTP》学习

图解系列的书籍基本都属于入门书籍,讲的通俗易懂。《图解HTTP》这本书主要讲HTTP的基础知识,内容也不多,对于HTTP入门,了解HTTP大致的内容来说很有帮助,可以先阅读这本书,了解HTTP大致的内容之后,再学习一些更深入的书籍,来加深理解。这本书内容比较少,可以快速阅读,花费的时间也不多,比较推荐。...

2021-09-25 09:16:35 119

原创 《图解TCP/IP》学习

《图解TCP/IP》讲解的是TCP/IP各层的一些内容,配了一些图片用于理解,对于整体内容来说,比较通俗易懂,较为简单,有些方面讲的不够深入,想具体学习可以使用《计算机网络:自顶向下方法》。不过对于了解TCP/IP各层的一些知识还是比较推荐的,可以做到快速阅读,了解各层的基础知识,对TCP/IP各层有一个整体的了解,花费的时间也不多,对于计算机网络入门来说比较推荐,想要更深入的了解计算机网络知识,可以阅读《计算机网络:自顶向下方法》。...

2021-09-25 09:08:58 84

原创 《MySQL必知必会》学习

这本书主要将的就是sql语句用法,包括其用到的很多关键字、函数的讲解,我基本是浏览了一遍,了解到了sql语句的大致用法,如果之后需要用到的话,可以再查阅相关内容的使用方法。

2021-09-25 08:59:52 77

原创 IP协议总结

IP协议总结文章目录IP协议总结1.网络层和数据链路层的关系2.路由控制3.数据链路的抽象化4.IP属于面向无连接型1.网络层和数据链路层的关系数据链路层主要提供在同种链路之间的数据传输,而网络层则负责从一种数据链路到另一种数据链路之间的连接,涉及到多种类型数据链路的连接就要使用网络层。例如:外出旅行,通过飞机、火车、公交车、步行到达目的地,链路层相当于用一种交通工具到达中间一个地址、网络层则负责几种交通工具之间的连接。2.路由控制路由控制是指将分组发送到最终目标地址的功能。一个数据之所以能过到

2021-09-23 14:11:51 392

原创 数据链路层相关技术总结

数据链层涉及的相关技术文章目录数据链层涉及的相关技术1.MAC地址2.共享型介质网络3.非共享介质网络4.根据MAC地址转发5.环路检测技术6.VLAN在OSI参考模型中数据链层设计的相关技术,包括MAC寻址(物理寻址)、介质共享、非公有网络、分组交换、环路检测、VLAN(虚拟局域网)、以太网、WLAN(无线局域网)、PPP(点对点协议)、FDDI(光纤分布式数据接口)等。1.MAC地址MAC地址用于识别数据链路中互连的节点。其中诸如VLAN、蓝牙等设备中也使用相同规格的MAC地址。在总线型和环形

2021-09-22 16:52:41 1934

原创 TCP、UDP提供的运输服务

文章目录1.TCP提供的服务2.UDP提供的服务当软件开发者在因特网上开发一个应用时,首先要决定的是,选择UDP还是TCP。1.TCP提供的服务TCP提供的服务包括面向连接服务和可靠数据传输服务。当某个应用程序调用TCP作为其运输协议时,该应用程序就能获得TCP提供的这两种服务。面向连接的服务: 再应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做准备。在握手阶段之后,一个TCP连接就在两个进程的套接字之间建立了。

2021-09-05 10:10:40 3305

原创 可提供应用程序使用的运输服务

文章目录1.可靠数据传输2.吞吐量3.定时4.安全性包括因特网在内的很多网络提供了不止一种运输层协议,当开发一个应用时,必须选择一个可用的运输层协议。可以通过研究这些运输层协议提供的服务,选择一个较为恰当的协议。1.可靠数据传输分组可能在计算机网络丢失。对于像银行、文件传输等应用,数据丢失可能造成灾难性的后果。运输层协议能够潜在的向应用程序提供一个重要的服务是进程到进程的可靠数据传输。确保应用程序的一端发送的数据正确的、完全的交付给应用程序的另一端,就认为是可靠数据传输。当一个运输程序提供这种服务时,

2021-09-04 23:32:52 260

原创 运行在不同主机上的进程通信

文章目录1.客户和服务器进程2.进程与计算机网络之间的接口3.进程寻址在操作系统知识中,运行在同一个操作系统上的多个进程可以根据进程间的通信机制相互通信。而在计算机网络知识中比较关注的是运行在不同端系统之间的进程通信。在两个不同端系统上的进程,通过计算机网络交换报文而相互通信。发送进程生成并向网络中发送报文;接受进程接受这些报文并可能通过回送报文进行相应。1.客户和服务器进程网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。我们通常将两个进程之一标识为客户(client),而另一个进程标

2021-09-04 22:23:08 3262 7

原创 TCP/IP与OSI参考模型

文章目录TC/IP分层模型OSI模型TC/IP分层模型(1)应用层,是网络应用程序以及它们的应用层协议存留的地方。因特网的应用层包括许多协议,例如HTTP(它提供了Web文档的请求和传送)、SMTP(它提供了电子邮件报文的传输)、FTP(它提供两个端系统之间的文件传送)。应用层协议分布在多个端系统上,而一个端系统的应用程序使用协议与另一个端系统中的应用程序交换信息分组。我们把这种应用层的信息分组称为报文。(2)运输层。因特网的运输层在应用程序端点之间传输应用层报文。在因特网中有两种运输协议,

2021-09-04 17:50:13 307

原创 分组交换和电路交换

文章目录分组交换电路交换通过网络链路和交换机移动数据有两种基本方法:电路交换和分组交换。分组交换在各种网络应用中,端系统彼此交换报文。报文可以执行一种控制功能,也可以包含数据。为了从端系统到目的系统发送一个报文,源将长报文划分为较小的数据块,称之为分组传送。(交换机主要有两类:路由器和链路层交换机)。分组以等于该链路的最大传输速度传输通过通信链路。多数分组交换机在链路的输入端使用存储转发传输机制。存储转发传输是指在交换机能够开始向输出链路传输该分组的第一比特之前,必须接受到整个分组。所以分组交

2021-09-04 10:40:39 386

原创 丢包、转发表和路由协议简介

(1)每台交换机有多条链路与之相连。对于每条相连的链路,该分组交换机具有一个输出缓存(也称输出队列),它用于存储交换机用于发往那条链路的分组。该输出缓存在分组交换中有着重要的作用。如果到达的分组需要传输到某条链路,但发现该链路正忙于传输其它分组,该到达分组必须在传输分组中等待。因为缓存空间的大小有限,一个到达的分组可能发现该缓存已经被其它等待传输的分组完全充满了。在此情况下将出现分组丢失(丢包),到达的分组或已经排队的分组之一将之丢弃。(2)路由器从与它相连的一条通信线路得到分组,然后向另一条与它..

2021-09-04 09:23:09 207

原创 C++关联容器简介

关联容器支持高效的关键字查找和访问操作。两个主要的关联容器类型是map和set。map中的元素是一些关键字-值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字;set支持高效的关键字查询操作——检查一个给定的关键字是否在set中。例如,在某些文本处理中,可以用一个set来保存想要忽略的单词。字典是一个很好的使用map例子:可以将单词作为关键字,将单词释义作为值。标椎库提供8个关联容器。这8个容器间的不同体现在三个维度上:每个容器(1)或者..

2021-09-02 18:59:58 61

原创 简单选择排序、树形选择排序

文章目录1.简单选择排序2.树形选择排序1.简单选择排序简单选择排序算法思想:(1)在第i趟排序过程中,通过n-i次关键字之间的比较,从剩余的n-i+1个记录中选出最小的记录,并和第i个记录交换。(2)对于i=1,…,n-1,执行上述过程,直至整个序列有序。简单选择排序算法://5.简单选择排序void SelectSort(SqList& L) { KeyType temp; int k; for (int i = 1; i < L.length; i++) {

2021-08-28 22:33:41 185

原创 冒泡排序、快速排序

文章目录1.冒泡排序2.快速排序1.冒泡排序冒泡排序也称简单交换排序。它的基本操作很简单。首先将第一个记录与第二个纪录相比较,如果为逆序,则交换两者,然后比较第二个和第三个记录,以此类推,直到第n-1个关键字和第n个关键字相比较为止,这为一趟冒泡,其结果是最大的记录被安排到了最后一个位置。然后进行第二趟冒泡,对前n-1个记录进行同样操作,直到完成n-1趟冒泡为止。冒泡排序算法://冒泡排序#define MAXSIZE 256typedef int KeyType;typedef struc

2021-08-28 19:44:15 234

原创 直接插入排序、希尔排序

文章目录1.直接插入排序2.希尔排序1.直接插入排序直接插入排序 是一种最简单的排序算法,它的基本操作是将一个记录插入已排好的有序表,从而得到一个新的、记录数增加1的有序表。例如:设有一个由待排序的一组记录组成的线性表,关键字的初始序列为{48,35,66,91,74,18}。我们可以认为第一个关键字{48}组成的线性表已是有序表;将第二个关键字插入前面的有序表,使之有序,得到序列{35,48};再将第三个关键字插入,使之有序,得到序列{35,48,66};如此重复,直到所有关键字都已插入,完成排序。

2021-08-28 16:42:25 151

原创 C++中static_cast、const_cast、reinterpret_cast关键字

文章目录1.static_cast2.const_cast3.reinterpret_caststatic_cat、const_cast、reinterpret_cast都是C++中用于强制类型转换的关键字,其一般格式如下:cast-name<type>(expression);1.static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如:int i, j;double slope = static_cast<doub

2021-08-26 17:11:51 287

原创 C++函数模板和类模板

文章目录1.函数模板2.在函数模板中使用多种类型3.类模板1.函数模板函数模板属于类属,它能处理不同类型的数据。当编译器遇到函数调用时,将根据实际参数的类型产生特定的代码。函数模板的定义形式是:template <类型参数表>返回值类型 函数名 (形式参数表) { //函数体}函数重载是函数名相同,当参数一定不完全相同,并且这些函数执行操作类似。采用函数重载,需要对每个函数分别写出相应的代码,如:int square(int number) { return nu

2021-08-23 23:01:45 154

原创 C++异常处理

文章目录1.抛出异常2.处理异常1.抛出异常例:float divide(int dividend, int divisor) { if(divisor == 0) { throw "错误:0作除数\n"; else return float(dividend) / divisor;} 其中,throw是一个关键字,它后面是一个参数,该参数可以是任意一种类型值。throw语句所在行称为异常抛出点,当程序执行throw语句之时,函

2021-08-23 21:35:20 47

原创 C++多重继承和多继承

文章目录多重继承多继承多重继承多重继承表示为继承链,是由若干层次的类构成。例如,如图所示的继承关系多继承如果一个子类具有两个或者多个直接父类,那么就称为多继承。例如,如下类的继承关系多继承的声明一般格式为:class <子类名> : <继承修饰符><基类名1>, <继承修饰符><基类名2>, ..., <继承修饰符><基类名n>...

2021-08-23 20:52:21 156

原创 指向基类的指针

指向基类对象的指针可以指向其子类的对象,当基类指针指向子类对象时,采用该指针所访问的仍然是基类中的成员。这种类型的指针具有如下特性:(1)指向基类对象的指针可以指向其子类的对象。(2)如果子类覆盖了基类中的成员,但通过基类指针所访问的成员仍然是基类成员,而不是子类成员。...

2021-08-23 17:58:03 554

原创 C++虚函数、纯虚函数和抽象类

文章目录1.虚函数2.纯虚函数3.抽象类1.虚函数虚函数是类中的一个函数成员,与其它函数成员的唯一区别是在子类中覆盖它。声明虚函数的方法很简单,只要在需要声明为虚函数的函数成员返回值类型之前加上virtual关键字。如:class A {private: int a;public: virtual void setA(int n) { //虚函数,需要在子类中将其覆盖 a = n; }};对于虚函数,编译器完成的是动态连编,即对函数的调用是在运行

2021-08-23 16:42:43 151

原创 C++基类和子类的构造函数的调用

文章目录基类和子类构造函数和析构函数的调用向基类的构造函数传参数基类和子类构造函数和析构函数的调用当基类和子类都有构造函数时,如果定义了一个子类对象,那么首先要调用基类的构造函数,然后再调用子类的构造函数;析构函数的调用次序与此相反,即先调用子类的析构函数,再调用基类的构造函数。向基类的构造函数传参数基类和子类如果都使用了默认的(缺省)构造函数,它们的调用是自动完成的,这是一种隐式的调用。但如果基类的构造函数带有参数,或者基类有多个构造函数,那么调用的方法是让子类的构造函数显示的调用基类的构造函数,

2021-08-23 14:05:13 3507

原创 C++类的继承

文章目录1.继承的定义2.保护成员和类的访问1.继承的定义C++允许在当前类的基础上构造新类,这样,就继承了当前类的所有数据成员和函数成员(构造函数和析构函数除外)。继承是OOP程序设计中很重要的一个方面,继承易于扩充现有类已满足新的应用。通常将已有的类称为父类,也称为基类,将新产生的类称为子类,也称为导出类或派生类。如:class A {private: int a; void a2();public: void a1(int);};class B : public

2021-08-23 11:00:04 507

原创 C++this指针

this是一个隐含的内嵌指针,在函数成员中频繁出现,它指向的是调用该成员函数的当前对象。

2021-08-22 23:04:20 62

原创 C++对象赋值和类的拷贝构造函数

文章目录1.对象赋值问题2.拷贝构造函数3.调用拷贝构造函数的情况1.对象赋值问题采用赋值运算符=可以将一个对象赋值给另一个对象,或者采用一个对象初始化另一个对象。在默认情况下,该操作执行的是对象成员之间的复制,也称为按位复制或浅复制。当采用一个对象初始化另一个对象时,对象成员之间的赋值也是按位复制,即将一个的数据成员按在内存中存储形式(二进制位),直接复制给给另一个对象。如:class A { private: int a; public: voi

2021-08-22 22:59:55 1619

原创 C++友元函数

友元函数不是类中的函数成员,但它可以访问类的私有成员。类的私有成员对于类外语句是隐藏的,如果要访问它们,必须调用公有函数成员。但友元函数可以打破这个限制,友元函数和类的函数成员一样,可以访问类的私有成员。友元函数既可以是一个外部函数,也可以是另外一个类的函数成员。讲一个函数声明为一个类的友元方式很简单,只要将关键字friend放在函数原型之前就可以friend <返回值类型> <函数名>(形式参数)如:class A {private: ...public.

2021-08-22 17:23:39 83

原创 C++静态成员

文章目录1.静态数据成员2.静态函数成员1.静态数据成员静态数据成员 是类中的一个成员,定义时前面有static关键字修饰它的特点是(1)同一个类中的所有对象都共享该变量。如果类的一个对象改变了静态数据成员的值,那么该类的所有对象的该静态数据成员的值都将改变。(2)静态变量不依赖对象而存在,无论是否定义该类的对象,这种类型的变量都存在。class StaticDemo {private: static int x; //说明静态的数据成员 int y;public:

2021-08-22 15:56:53 125

空空如也

空空如也

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

TA关注的人

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