当前位置: 首页 > news >正文

string类的使用方式的介绍


目录

前言

1.什么是STL

2. STL的版本

3. STL的六大组件

4.STL的缺陷

5.string

5.1 为什么学习string类?

5.1.1 C语言中的字符串

5.2 标准库中的string类

5.3 string类的常用接口的使用

5.3.1 构造函数

5.3.2 string类对象的容量操作

5.3.3 string类对象的访问及遍历操作

5.3.4 string类对象的修改操作

5.3.4 string类非成员函数

​编辑

总结


前言

  大家好呀,失踪两个月的博主回来了,不要问博主去干什么了?问就是去修炼内功心法去了,时至今日按照我们之前的更新进度,我们应该进入到我们stl的相关内容的学习。那么我们今天就从string开始逐渐给大家介绍我们的stl的内容,但是在介绍之前,我们先笼统的了解一下我们stl的内容。


1.什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2. STL的版本

原始版本

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。

P. J. 版本:

由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。

RW版本:

由Rouge Wage公司(该公司已经倒闭,因此该版本已经多年没有更新所以我们不用过度关注)开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

SGI版本:

由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,STL是规范,他有很多版本,其底层实现大同小异,但对于某些接口其还是有着不同的主要参考的就是这个版本。

3. STL的六大组件

这里的容器就是我们的数据结构,然后空间适配器就是我们的内存池。

4.STL的缺陷

1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。

2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。

3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。

4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。

5.string

5.1 为什么学习string类?

5.1.1 C语言中的字符串

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

5.2 标准库中的string类

1. 字符串是表示字符序列的类

2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。

3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。

4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参basic_string)。

5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作

总结:

1. string是表示字符串的字符串类

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作

3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>  string;

4. 不能操作多字节或者变长字符的序列。

5.3 string类的常用接口的使用

注意:小编介绍的都是我们常用接口,对于具体的还需要我们自己去查阅文档进行深度学习。

5.3.1 构造函数

这里我们常用的就这几个,这里我们简单给大家演示一下该使用:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1; // 构造空的string类对象s1string s2("hello xhj"); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3string s4(10, 'c');//使用n个字符,构造我们的对象//注意我这里打印,是需要重载我们的流插入操作符的,之后我们也会在对string类的实现给大家介绍,//这里为了大家更加直观的感受,我们这里先直接使用即可cout << s1 << endl;//在有些编译器下就算访问到string类的‘\0'其也不会显示的打印出来。cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0;
}

结果展示:

5.3.2 string类对象的容量操作

注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。(max_size这个接口不同编译器是不同的结果,所以该使用是没有很大意义的)

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用/0来填充多出的元素空间(size也会发生改变),resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。(因为对于缩容来讲是有代价的,在我们学习中并没有对一块空间部分释放的函数(系统不支持分段释放空间),所以该实际上进行的操作其实是将数据内容拷贝到一个新的缩小后的·空间)

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve改不改变取决于不同的编译器和我们string类中是否有数据,也有可能不缩小(该不具有约束力)。

(对于reserve来讲不同的编译器对于编译过程中的扩容机制是不一样的,对于vs是在原来的基础上加上扩容的大小,Linux下是直接扩到指定大小,但该本质上都不会小于我们要求的大小)

此外这里我们的shrink_to_fit,这个函数的作用是将string的capacity减到size大小(但是这个函数是不具有约束力的,所以这里也不一定会缩到size大小),这里我们做个简单的了解即可。

代码演示:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1;s1.reserve(100);//开容量cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(10);//开有效数据的空间cout << s1.size() << endl;cout << s1.capacity() << endl;s1.clear();//清空有效数据cout << s1.size() << endl;cout << s1.capacity() << endl;
}

结果:

5.3.3 string类对象的访问及遍历操作

这里我们的遍历方式是有多种的,但是对于该底层如何是实现的,我们待会再了解,这里先给大家演示一下,该遍历方式:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1("hello world!");//[]遍历for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;//正向迭代器的遍历string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";it++;}cout << endl;//反向迭代器的遍历string::reverse_iterator it1 = s1.rbegin();while (it1 != s1.rend()){cout << *it1 << " ";it1++;}cout << endl;//范围forfor (auto e : s1){cout << e << " ";}cout << endl;
}

结果展示:

这里我们可以看到反向迭代器是一种从后往前的遍历方式,至于该具体实现,我们以后再和大家讲解。此外,我们需要了解一下以下的相关知识:

1.对于,[]我们出现数组越界采用的是断言的方式去进行处理的

2.对于内置类型和自定义类型该[],是具有本质的区别的,对于内置类型该是一个解引用操作,也就是 *(a+i),但是对于内置类型,其实s.operator[](i);,因此对于我们的自定义类型我们是需要对其进行运算符重载的。

3.迭代器(任何容器都支持迭代器,并且用法都是类似的,而我们的[]只支持底层是数组的容器)

对于迭代器,上面我们只讲述了该用法,但是对于迭代器,我们需要了解更多一点该相关内容:

literator提供一种统一的方式访问和修改容器数据 ,算法可以通过迭代器,去处理容器中数据

此外我们的迭代器一共分为四种:

一种是普通变量的正向迭代器,一种是const变量的正向迭代器,对于const变量我们只能使用const迭代器(涉及到我们的权限问题)而且我们的普通变量的迭代器可以读写,而我们的const迭代器只能读取

另外两种就是反项的两个迭代器

5.3.4 string类对象的修改操作

这里我们的append和我们的+=的效果是一样的,都可以起到在我们对象后面加上一个字符串和单个字符的效果(这是由于函数重载得到的),而我们的push_back只能在后面加上一个字符。

因此:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。(编译器也会自动扩容,但是我们知道数据个数的情况下会直接扩容会减少成本)

这里简单的给大家演示一下这三个函数的使用方式:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1("hello");s1 += 'w';string s2("hello");s2.append(1,'w');string s3("hello");s3.push_back('w');cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;string s4("hello");string s5("hello");s4.append("world");s5 += "world";cout << s4 << endl;cout << s5 << endl;return 0;
}

结果如下:

这里我们的insert,erase,以及我们的replace,我们都不是经常使用,这里原因是由于这里带来的效率过于低下,那么我们只需要对其做个简单的认识即可。

insert:

insert的作用是在我们指定的位置进行插入,这里有一个下标版本和一个迭代器版本,但是不建议经常使用insert因为这里涉及到效率的问题

erase:

这里我们的npos是:

这里指的是一个静态成员,实际上该是无符号数的-1,也就是说使用该值后就会自动删除pos位置后的所有字符。

erase由于是在中间或者头部删除数据的所以效率也是比较低的我们不推荐。

replace:

对于替换这个函数我们这里也不常使用因为这里需要消耗的代价太大。

这里我们就简单的给大家简单的演示一下,该使用方式即可:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1("hello");s1.insert(2, "xxx");cout << s1 << endl;s1.erase(2, 3);cout << s1 << endl;s1.replace(0, 5, "world");cout << s1 << endl;return 0;
}

运行结果如下:

然后就是我们的pop_back了,这里就是将最后的一个字符删除即可,大家可以自己演示一下。

接下来我们需要了解的一个接口是我们的c_str,这里返回的是C语言形式的字符串,那么具体需要了解该是什么,我们需要看一下一下一段代码:

这里的cout<<s1<<endl;和cout<<s1.c_str();这两个得到的值是一致的,但实际上该一个是流提取操作符的重载,一个相当于打印的是char*(也就是返回C语言的字符串,因此这个函数的作用是将C语言和c++进行有些接口进行配合)

紧接着我们需要了解的是我们的find接口,和我们的rfind接口

这里注意我们的主要作用是:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置

这里注意其返回值是:

与此同时我们的rfind的作用是:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置

这里我们的find和我们的rfind的使用方式是一致的,那么我们这里就给大家演示其中一个的使用方式。

最后一个我们经常使用的接口就是,substr,该作用就是:在str中从pos位置开始,截取n个字符,然后将其返回。

这里我们返回的也是一个string对象,该使用方式如下:

5.3.4 string类非成员函数

这里我只给大家介绍一个getline接口,对于其他接口,我们在进行模拟实现后,大家就可以轻而易举的理解了。

理解我们的getline首先我们需要知道一个小的知识点,这里我们配合一段代码讲解一下:

#include<iostream>
#include<string>//使用记得包文件
using namespace std;
int main()
{string s1;cin >> s1;cout << s1;return 0;
}

运行结果:

这里我们输入的明明是我们的:hello world,但是实际上我们s1是hello,那么是什么原因导致这样呢?

这是由于cin在逐个输入数据时是以空格或者换行来辨别数据的,所以在逐个输入数据时,我们的空格或者换行是不能被读取的如果我们想要读取换行就需要使用到istream中的getline函数

getline是非成员函数,进行的是输入操作,默认这里遇到换行符结束输入字符串。

这里我给大家简单的演示一下:

文章最后,我们需要了解的是,与我们string相关的最后一类接口:

这里就不给大家一个一个具体介绍了,这里大家需要记住的是我们经常使用的两个:

我们的to_string就是将我们其他类型转换为我们的string类型,我们的stoi就是将我们的string类型转化为我们的整型。


总结

到这里我们对string各个常用接口的介绍已经到这里了,但是我们一定要经常使用,才会铭记于心,后续为了加强大家的理解,小编会给大家带来我们string类的相关模拟实现。请大家敬请期待。


相关文章:

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类&#xff1f; 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…...

FFmpeg 命令:从入门到精通 | 命令行环境搭建

FFmpeg 命令&#xff1a;从入门到精通 | 命令行环境搭建 FFmpeg 命令&#xff1a;从入门到精通 | 命令行环境搭建安装 FFmpeg验证 FFmpeg 是否安装成功 FFmpeg 命令&#xff1a;从入门到精通 | 命令行环境搭建 安装 FFmpeg 进入 FFmpeg 官网&#xff1a; 点击 Download&#…...

《从零开始学ARM》勘误

1. 50页 2 51页 3 236页 14.2.3 mkU-Boot 修改为&#xff1a; mkuboot 4 56页 修改为&#xff1a; 位[31&#xff1a;24]为条件标志位域&#xff0c;用f表示&#xff1b; 位[23&#xff1a;16]为状态位域&#xff0c;用s表示&#xff1b; 位[15&#xff1a;8]为扩展位域&…...

10款录屏软分析与选择使用,只看这篇文章就轻松搞定所有,高清4K无水印录屏,博主UP主轻松选择

录屏软件整理 如下为录屏软件&#xff0c;通过思维导图展示分析介绍&#xff1a; https://www.drawon.cn/template/details/6522bd5e0dad9029a0b528e1 如下为整理的录屏软件列表 名称产地价格支持的平台下载地址说明OBS国外免费开源windows/linux/machttps://obsproject.co…...

android: android:onClick=“@{() -> listener.onItemClick(viewModel)}“

一、前言&#xff1a;在我使用editTest控件的时候&#xff0c;它的下方有一条横线。我想把它去掉然后我在布局文件中这样写 android:background"null" 导致报错&#xff0c;报错信息是&#xff1a; android:onClick"{() -> listener.onItemClick(viewModel)…...

温故知新:dfs模板-843. n-皇后问题

n−n−皇后问题是指将 nn 个皇后放在 nnnn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 nn&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n…...

刷题笔记28——一直分不清的Kruskal、Prim、Dijkstra算法

图算法刷到这块&#xff0c;感觉像是走了一段黑路快回到家一样&#xff0c;看到这三个一直分不太清总是记混的名字&#xff0c;我满脑子想起的是大学数据结构课我坐在第一排&#xff0c;看着我班导一脸无奈&#xff0c;心想该怎么把这个知识点灌进木头脑袋里边呢。有很多算法我…...

Mysql时间同步设置

Mysql时间同步设置 当涉及到设置MySQL数据库时间与电脑同步时&#xff0c;实际的步骤可能会因操作系统和数据库版本的不同而有所差异。以下是一个基本的步骤示例&#xff0c;供您参考&#xff1a; 检查电脑时间&#xff1a; 首先确保电脑操作系统的时间是正确的。 设置MySQL时…...

如何理解分布式锁?

分布式锁的实现有哪些&#xff1f; 1.Memcached分布式锁 利用Memcached的add命令。此命令是原子操作&#xff0c;只有在key不存在的情况下&#xff0c;才能add成功&#xff0c;也就意味着线程得到了锁。 2.Reids分布式锁 和Memcached的方式类似&#xff0c;利用Redis的setn…...

windows 远程连接 ubuntu桌面xrdp

更新 sudo apt update安装组件 sudo apt-get install xorg sudo apt-get install xserver-xorg-core sudo apt-get install xorgxrdp sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsxrdp sudo apt install xrdp sudo systemctl status xrdp sudo …...

数据采集时使用HTTP代理IP效率不高怎么办?

在进行数据采集时&#xff0c;使用HTTP代理 可以帮助我们实现隐私保护和规避封禁的目的。然而&#xff0c;有时候我们可能会遇到使用HTTP代理 效率不高的问题&#xff0c;如连接延迟、速度慢等。本文将为您分享解决这一问题的实用技巧&#xff0c;帮助您提高数据采集效率&#…...

你了解的SpringCloud核心组件有哪些?他们各有什么作用?

SpringCloud 1.什么是 Spring cloud Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型&#xff0c;帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上&#xff0c;使得开发者很容易入手并快速应用于生产中。…...

【Gradle-10】不可忽视的构建分析

1、前言 构建性能对于生产力至关重要。 随着项目越来越复杂&#xff0c;花费在构建上的时间就越长&#xff0c;开发效率就越低。 通过分析构建过程&#xff0c;可以了解项目构建的时间都花在哪&#xff0c;以及项目存在哪些潜在的问题&#xff0c;找到构建瓶颈&#xff0c;解…...

2034. 股票价格波动

给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。 不巧的是&#xff0c;由于股票市场内在的波动性&#xff0c;股票价格记录可能不是按时间顺序到来的。某些情况下&#xff0c;有的记录可能是错的。如果两个有相同时间戳的记录出现…...

JavaScript 事件详解细节

JavaScript 事件详解细节 JavaScript 中的事件是前端开发中非常重要的一个概念。通过事件&#xff0c;我们可以捕捉和响应用户与网页的交互&#xff0c;比如点击按钮、输入文字等。这篇博客文章将详细介绍 JavaScript 中的事件&#xff0c;希望能帮助你更好地理解和使用这一功…...

【MySQL】事务管理

目录 MySQL事务管理 事务的概念 事务的版本支持 事务的提交方式 事务的相关演示 事务的隔离级别 查看与设置隔离级别 读未提交&#xff08;Read Uncommitted&#xff09; 读提交&#xff08;Read Committed&#xff09; 可重复读&#xff08;Repeatable Read&#xf…...

Git 学习笔记 | Git 基本操作命令

Git 学习笔记 | Git 基本操作命令 Git 学习笔记 | Git 基本操作命令文件的四种状态查看文件状态忽略文件 Git 学习笔记 | Git 基本操作命令 文件的四种状态 版本控制就是对文件的版本控制&#xff0c;要对文件进行修改、提交等操作&#xff0c;首先要知道文件当前在什么状态&…...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第七节 - Python 中的字符串模板类)

在字符串模块中,模板类允许我们为输出规范创建简化的语法。该格式使用由 $ 和有效 Python 标识符(字母数字字符和下划线)组成的占位符名称。用大括号将占位符括起来,使其后面可以跟更多的字母数字字母,且中间不留空格。写入 $$ 会创建一个转义的 $。 Python 字符串模板:…...

第八章 排序 十四、最佳归并树

目录 一、定义 二、多路最佳归并树 三、多路最佳归并树少了一个归并段 四、总结 一、定义 最佳归并树是指将若干个有序序列合并成一个有序序列的一种方式&#xff0c;使得所有合并操作的总代价最小的一棵二叉树。其中&#xff0c;代价通常指合并两个有序序列的操作次数或比…...

Python 中,类的方法的标准注释模板

在 Python 中&#xff0c;类的标准注释通常遵循以下格式&#xff1a; class 类名:"""类的简要描述属性:- 属性1 (类型): 属性1的描述- 属性2 (类型): 属性2的描述方法:- 方法1(): 方法1的描述- 方法2(): 方法2的描述示例:>>> 对象 类名()>>>…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...