重生之我在21世纪学C++—string

news2025/1/16 12:37:41

一、string 概念

string 字符串是一种更加高级的封装,string 字符串中包含大量的方法,这些方法可以使得字符串的操作变得更加简单。如果 string 使用的好,慢慢你就不想使用字符数组来存放字符串了,因为更简单嘛。

 C++ 将字符串直接作为一种类型,也就是 string 类型,使用 string 类型创建的对象就是 C++ 的字符串。

使用 C++ 中提供的 string 时,必须添加头文件 <string>

二、string 常见操作

1、创建字符串

方式解释
string s1;创建空字符串
string s2 = "hello world";创建一个内容为“hello world”的字符串(常用)
string s3("hello world");创建一个内容为“hello world”的字符串
string s4 = s2;用一个现成的字符串 s2 ,初始化另一个字符串 s4

(1)string s1 表示创建空字符串,相当于创建整型 int a,但未给 a 一个初始值。

(2)string s2 = "hello world" 表示创建一个字符串 s2,它的内容是 "hello world",需要注意的是 s2 中的字符串不再以 \0 作为结束标志了。(C 语言中的字符串是以 \0 作为结束标志的)

(3)C++中的 string 创建的字符串和 char 类型的数组所表示的字符串有一个区别, string 类型的字符串对象是可以直接赋值的。

2、string 字符串的输入

(1) cin 的方式

可以直接使用 cin 给 string 类型的字符串中输入一个字符串的数据。

这里我们可以发现,其实用 cin 的方式给 string 类型的字符串中输入数据,可以输入不带空格的字符串,此时一切正常。但是如果是带有空格的字符串,当遇到空格时读取就结束了,所以此时就没有办法正常读取里。如果想要读取带有空格的字符串,这个时候就要使用 getline 函数了。

(2) getline 的方式

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储为字符串。 

getline 函数有两种不同的形式,分别对应读取字符串的两种情况。

istream& getline (istream& is, string& str);

istream& getline (istream& is, string& str, char delim);

istream输入流类型,cin 是 istream 类型的标准输入流对象

ostream输出流类型,cout 是 ostream 类型的标准输出流对象

getline 函数是从输入流中读取一行文本信息,所有如果是在标准输入流(键盘)中读取数据,就可以传 cin 给第一个参数

1)第一种 getline 函数以换行符( '\n' )作为字符串的结束标志,它的一般格式是:

getline(cin, string str);

// cin 表示从标准输入流中读取信息

// str 存放读取到的信息的字符串

这种形式的 getline 函数是从输入流(例如标准输入流 cin)中读取数据,直到遇到换行符('\n')为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型的变量 str 中。

2)第二种 getline 函数允许用户自定义结束标志,它的一般格式是:

getline(cin, string str, char delim);

//cin 表示从标准输入流中读取信息

//str 存放读取到的信息的字符串

//delim 自定义的字符串读取结束标志

这种形式的 getline 函数是从输入流中读取数据,直到遇到用户指定的结束标志字符( delim )停止读取,然后将读取到的文本(不包括结束标志字符)存储到指定的 string 类型变量 str 中。

3、size()

string 中提供了 size() 函数用于获取字符串长度

在C++中关于字符串的操作函数都是包含在 string 中的,所以调用这些函数时,需要用 . 点运算符

4、迭代器(iterator)

迭代器是一种对象,它可以用来遍历容器(比如我们现在学习的 string )中的元素,迭代器的作用类似于指针,或者数组下标。访问迭代器指向的值,需要解引用(*)

C++ 中的 string 提供了多种迭代器,用于遍历和操作字符串中的内容。这里给大家介绍一种最常 用的迭代器:begin() end()

begin() : 返回指向字符串第一个字符的迭代器,需要用一个迭代器变量来接收。

end() : 返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)。

string 中 begin() 和 end() 返回的迭代器的类型是 string::iterator

迭代器是可以进行大小比较的,也可以进行 + 或者 - 整数运算
比如:it++,就是让迭代器前进一步it-- 就是让迭代器退后一步

同一个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个数


使用迭代器打印数组元素:

正序遍历:

逆序遍历:

通过迭代器找到元素后,改变迭代器指向的元素,是可以直接改变字符串内容的。

5、push_back()

push_back() 用于在字符串尾部插一个字符

6、字符串的 += 和 + 运算

push_back () 是用于在字符串末尾添加一个字符,然而部分情况下我们需要向原有的字符串末尾继续添加字符串

我们需要知道的是 string 类型的字符串是支持 + 和 += 运算的。这里的本质是 string 中重载了 operator+= 这个操作符。

7、pop_back()

pop_back() 用于删除字符串尾部的一个字符。这个成员函数是在 C++11 标准中引入的,所以有的编译器可能不支持。

注意:当字符串中没有字符的时候,即为空字符串,此时如果调用 pop_back() ,程序会出现异常,因为这种行为是标准未定义行为,要避免这么使用。所以不可对空字符串继续进行pop_back()操作。

8、insert

如果我们需要在字符串中间的某个位置插入一个字符串,这是就要使用 insert() 函数了。

函数原型如下:

string& insert (size_t pos, const string& str);

//在pos位置前面插入一个string字符串

string& insert (size_t pos, const char* s);

//在pos位置前面插入一个C语言风格的字符串

string& insert (size_t pos, size_t n, char c);

//pos位置前面插入 n 个字符 c

1)

2)

3)

9、find()

find() 函数用于查找字符串中指定子串或字符,并返回子串或字符在字符串中第一次出现的位置

size_t find (const string& str, size_t pos = 0) const;

//查找string类型的字符串str,默认是从头开始查找,但是也可以通过输入一个值pos从指定位置开始查找

size_t find (const char* s, size_t pos = 0) const;

//查找C风格的字符串s,默认是从头开始查找,但是也可以通过输入一个值pos从指定位置开始查找

size_t find (const char* s, size_t pos, size_t n) const;

//在字符串的pos这个位置开始查找C风格的字符串s中的前n个字符

size_t find (char c, size_t pos = 0) const;

//查找字符c,默认是从头开始,但是也可以通过输入一个值pos从指定位置开始查找

返回值:

1)若找到,则返回子串或字符在字符串中第一次出现起始下标位置

2)若未找到,返回一个整数值 npos 。一般通过 find () 函数的返回值是否等于 npos 来判断是否查找到子串或者字符。

(1)查找string类型的字符串str、

(2)查找C风格的字符串s

(3)查找C风格的字符串s中的前n个字符

(4)查找字符c

(5)查找不到的情况

在字符串中查找字符或者字符串时,有可能查找不到,这时候 find 函数会返回 npos 这个值,该数字并不是一个随机的数字,而是 string 中定义的一个静态常量 npos 。一般通过 find () 函数的返回值是否等于 npos 来判断是否查找到子串或者字符。

static const size_t npos = -1;

注意:npos 是 string 中定义的,使用 npos 需要带上 string:: 指明是string类中的。

10、substr()

substr() 函数用于截取字符串中指定位置指定长度的子串。函数原型如下:

string substr (size_t pos = 0, size_t len = npos) const;

//pos 的默认值是0,也就是从下标为0的位置开始截取

//len 的默认值是 npos,意思是从pos位置一直截取到字符串的末尾

substr () : 如果函数不传参数,就是从下标为 0 的位置开始截取,直到结尾,得到的是整个字符串,相当于直接打印整个字符串
substr (pos) :从指定下标 pos 位置开始截取子串,直到结尾
substr (pos, len) :从指定下标 pos 位置开始截取长度为 len 的子串。

返回值:

类型是 string ,返回的是截取到的字符串,可以使用 string 类型的字符串接收。

11、string 的关系运算

C++ 中为 string 提供了一系列的关系运算。

字符串的比较是基于字典序进行的,比较是对应位置上字符的ASCII值的大小,比较的不是字符串的长度。

例如:

"abc" < "aq"         // 'b' 的ASCII码值是小于 'q' 的

"abcdef" < "ff"         // 'a' 的ASCII码值是小于 'f' 的

"100" < "9"         // '1' 的ASCII码值是小于 '9' 的

需要注意的是,关系运算的双方中至少要有一个 string 风格的字符串,可以有C语言风格的字符串,但是不能对两个C语言风格的字符串进行关系运算。

12、和 string 相关的函数

(1)stoi / stol

stoi 是将字符串转换成 int 类型的值。

stol 是将字符串转换成 long int 类型的值。

函数原型如下:

int stoi (const string& str, size_t* idx = 0, int base = 10);

long stol (const string& str, size_t* idx = 0, int base = 10);

str 表示被转换的 string 类型的字符串。
idx 是一个输出型参数,也就是通过这个参数会带回一个值。idx 是一个指针,需要在外边创建一个 size_t 类型的值,传递它的地址给 idx,这个参数将会带回 str 中无法正确匹配数字的第一个字符的位置
base 表示被解析的字符串中数字的进制值,可能是 2,8,10,16 或者 0。

1)默认情况下这个值是 10,表示 10 进制数字

2)如果传递的是 2,表示被解析的字符串中是 2 进制的数字,最终会被转换成 10 进制。

3)如果传递的是 8,表示被解析的字符串中是 8 进制的数字,最终会被转换成 10 进制。

4)如果传递的是 16,表示被解析的字符串中是 16 进制的数字,最终会被转换成 10 进制。

5)如果传递的是 0,会根据字符串的内容的信息自动推导进制,比如:字符串中有 0x,就认为是 16 进制,0 开头会被认为是 8 进制,最终会转换成 10 进制。

(2)stod / stof

stod 是将字符串转换成 double 类型的值,和 stoi 函数相比较,少了描述字符串中数字进制的参数,其他参数完全一致。 stof 是将字符串转换成 float 类型的值。函数原型如下:

double stod (const string& str, size_t* idx = 0);

float stof (const string& str, size_t* idx = 0);

(3)to_string 

函数原型如下:

string to_string (int val);

string to_string (long val);

string to_string (long long val);

string to_string (unsigned val);

string to_string (unsigned long val);

string to_string (unsigned long long val);

string to_string (float val);

string to_string (double val);

string to_string (long double val);

to_string() 函数可以将数字转换成字符串,从上述函数原型的角度来看的话,该函数可以将整型、浮点型的数字转换成字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…

x86_64搭建ARM交叉编译工具链

点击上方"蓝字"关注我们 01、下载 >>> GCC 64位交叉编译下载&#xff1a;https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/ 喜欢那个版本自己找 02、简介 >>> 交叉编译器中“交叉”的意思就是在一个架构…

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…

IOS界面传值-OC

1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 &#xff08;1&#xff09;ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …

用 Python 自动化处理日常任务

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

Linux:地址空间(续)与进程控制

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;地址空间与进程控制》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

通过proto文件构建 完整的 gRPC 服务端和客户端案例

基础教程-简单案例&#xff08;快入入门java-grpc框架&#xff09; 参考官方入门案例教程&#xff1a;里面我看proto编译&#xff0c;其实直接用maven就能直接将.proto文件编译成java代码。快速入门 | Java | gRPC 框架https://grpc.org.cn/docs/languages/java/quickstart/ …

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!

文章目录 前言STL简介什么是STLSTL的版本STL的六大组件STL的重要性如何学习STL 总结 前言 上篇博客我们了解了初阶的模版函数&#xff0c;以及有关的一些使用方法。 今天我们来了解了解STL库的有关知识 跟我一起上车吧 STL简介 什么是STL STL&#xff1a;是C标准库的重要组成…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂&#xff0c;你在本地删除文件&#xff0c;并没有同步到云端&#xff0c;但是本地却显示同步成功。 比如删掉了一个目录&#xff0c;在本地看已经删掉&#xff0c;onedrive显示已同步&#xff0c;但是别的电脑并不会同步到这个删除操作&#xff0c;在网页版…

科研绘图系列:R语言绘制微生物物种系统发育树(phylogenetic tree)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍构成要素有根树与无根树构建方法应用领域说明的问题教程加载R包数据下载导入数据数据预处理系统发育树可视化准备画图数据1. 构建基础系统发育树 `p1`2. 添加条形图 `p2`3. 添加热图…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

微信小程序:跨页面数据修改全攻略

一、引言 在微信小程序开发中&#xff0c;常常会遇到需要在不同页面之间修改数据的情况。比如在商品详情页添加商品到购物车后&#xff0c;购物车页面需要实时更新商品数量和总价&#xff1b;在用户设置页面修改了个人信息&#xff0c;首页的用户信息展示区域也需要同步更新。…

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

java.text.SimpleDateFormat (日期)

前言&#xff1a; 小编最近让流感折磨的快嘎啦&#xff0c; 呜呜呜&#xff0c;拖更了俩天&#xff0c; 从明天开始我们继续日更&#xff01;&#xff01;&#xff01;&#xff01; 我们一直都是以这样的形式&#xff0c;让新手小白轻松理解复杂晦涩的概念&#xff0c; 把Ja…