从0开始的c++知识讲解之字符串(1)
作者作为新手,对于知识的讲解也是边输出内容也是边学习,如有缺陷,请多海涵,但同样,我会帮助你从新手视角看到新手的疑惑,并帮助你解决此疑惑
一,开宗明义,立意先行
string在C++里有可变性,为可变对象,他初始化后运行修改,比如拼接,替换,重新赋值,删除中间某个字符
但是在c#和Java里面不同,里面为不可变对象,具体内容涉及那边内容
二,头文件与命名空间
头文件 :# include <string>和 # include <string.h> 和 # include <cstring> 的区别
1,# include <string.h>
(1)c语言标准库,c语言头文件,出来c风格字符串,以\0结尾的char数组
(2)提供的是c字符操作函数,如strcpy,strlen
(3) c++里面兼容可使用,但不推荐,c++有他自己的
2, # include <cstring>
(1)c++对c标准库的包装,可以理解为对标上面:# include <string.h>的兼容版,与其功能类似,但是遵循c++的命名规范,所以c++应该用这个
(2)提供strlen,strcpy函数
3,# include <string>
(1)c++标准库,用来定义面向对象的字符串类 std::string,简单说定义字符串string,就要导入这个
(2)提供length(),find(),substr()等函数
三,字符串的简单不涉及函数使用方式
(1)可通过加号拼接,之后可以组合成 s +=" 新加字符串",将原来字符与新字符拼接,s为原来字符串
(2)可以重新对字符串赋值
3.append() 追加字符串
如 s.append(" www ")
四,关于字符串的函数介绍(重点):
1,长度获取---length()与 size()
(1)c语言里面的strlen(s)对标c++里面的 s.length() 和 s.size(),s为一组字符串,他们的作用都是获取字符串长度。至于python则比较简单,为len()
c++里面的length()和 size()你可以看成完全等价关系,都返回字符串占用的字节,只是size与STL容器有关系,不用过多区分
知识补充:length()只能获得字符串长度,无法获取字符型数组长度,而size()也不行,但是只能在栈的字符型数组取长度。但是strlen()可用获取字符型数组长度。
2,删除字符内容--erase()(英文意思:v.抹去;删除)
(1)erase()函数,需要包含头文件<string>
(2)用法:对象.erase(起始下标,删除数量)
**注意:不包含起始下标,从起始下标后一个下标开始删除,如果遇到空格,也算入内会删除
输出结果:
输出结果:
输出结果:
4,指定位置插入--insert()(英文意思:插入)
(1)需要包含头文件<string>
(2)用法:被插入对象.insert(下标,想插入的字符)
* *会在要插入的下标处插入,从下标开始往后挪,插入的数据是在下标前的间隙里插入,如过下标后是空格,记住把空格也当成一个字符串,他会往后挪
输出结果:
5,反转字符串--reverse() (英文意思:v.反转;颠覆;n.相反 adj.相反的 )
(1)需包含<algorithm> 头文件(英文意思:算法)
(2)用法: reverse(对象.begin(),s.end())
** 我知道你的疑惑,对象.begin()的括号里面不能填参数,他的作用是获取字符串首个字符起始位置,如果要改变位置,要在后面加你想起始的位置:对象.begin()+n,下图可视
输出结果:
输出结果:
6,字符末尾追加单个字符--push_back()
用法: 对象.push_back( ' 要追加的单个字符 ' )
输出结果:
7.查找字符串中字符位置--find()
接收对象=目标对象.find('查找的字串') 可以查找多个字符的字符串,加上 “ ” 双引号
输出结果:
8,替换--replace()
注意:这是直接对原字符串修改
9.提取子字符串--substr() (英文意思:字符截取)
用法:接收对象 =目标对象.substr(起始点下标,提取数量,若不写默认后面全部)
六,高级字符串的操作(超重点)
引言: 需先了解一下缓冲区的概率,对于新手来说比较模糊,特别是对于我这个之前学python头脑简单,cpp知识文盲的人和我一类的人。
概括: 缓冲区就像现实世界中的「快递分拣站」,是程序与外部设备(键盘、屏幕、文件等)之间的临时数据中转站。它存在的核心目的是:减少频繁的慢速IO操作,提升效率。(意思是io是频繁的接收输入与频繁的输出)
你可能好奇为什么,把电脑想象成一个快递站点,你今天将会断断续续的收到关于一个人的一百个快递,也要将这100个快递今天送出去,你这时有两种方案,法一:收到一个送一个。法二:收到10个后再统一一起去送。
你会怎么选:
分析法一:你断断续续的收到了1个,再送出一个,持续了10次,这时快递员心里想着大概是关于m之类的不好的话,他将快递接收到站点总共跑了10,他现在还要一个一个送出去还要跑10次,每次将快递送给同一个人同一个地方
分析法二:你断断续续的收到了10个,再一起送出去10个,虽然快递员将快递接收到站点总共跑了10次,但他送快递只需要跑一次,将这10个快递送到一个人手上就行,其他时间自己就可以休息一下,这对应了电脑,接收你的输入的指令,你输入完毕了,它作为电脑会慢慢接收你输入的指令,他此时也有两种选择,①它每接收并识别到了你指令的一个字就输出一次,总共10次接收和10次输出,②或者是它每接收并识别到了你指令的十个字再输出一次,总10次接收和一次输出,而这也对应了缓冲区的存在
1,#include<iostream>讲解:
(1) iostream 全称是 input / output stream ( input 输入 output 输出 stream n,流;小溪 v.流动 )
(2)C++ 中的 iostream
是标准输入输出库的核心组件,基于流(Stream)的概念实现数据的输入输出操作。以下是其关键知识点和用法详解:
1. 头文件与标准流对象
- 头文件:
#include <iostream>
- 标准流对象:
std::cin
:标准输入流(istream
类型),通常对应键盘输入。std::cout
:标准输出流(ostream
类型),对应控制台输出。std::cerr
/std::clog
:标准错误流,cerr
无缓冲,clog
有缓冲。
2. 输入输出运算符
- 运算符重载:
<<
(插入运算符):向流中写入数据。
示例:cout << "Hello, " << 42 << endl;
>>
(提取运算符):从流中读取数据。
示例:int x; cin >> x;
- 链式调用:运算符返回流对象的引用,支持连续操作。
3. 流操纵器(Manipulators)
- 常用操纵器:
std::endl
:换行并刷新缓冲区。std::hex
/std::dec
:以十六进制/十进制格式输出。std::setw(n)
(需<iomanip>
):设置输出宽度为n
。
示例:cout << setw(5) << 10;
输出10
。
4. 类型安全与错误处理
- 类型安全:无需格式说明符(如
%d
),自动根据变量类型处理。 - 错误状态检测:
cin.fail()
:检查输入是否失败(如类型不匹配)。cin.clear()
:清除错误状态。cin.ignore()
:清空输入缓冲区。
示例:输入错误后恢复:
cin.fail()是遇到以下问题时的情况:
接收的数据类型与输入的数据类型不一样时
cin.clear()
的作用是重置输入流的状态标志,让因错误而中断的输入流恢复可用。当输入操作失败(例如用户输入了字母,但程序期望数字),输入流会进入错误状态,导致后续所有输入操作被跳过。此时必须用 clear()
重置状态,才能继续读取数据。但是此时他的错误数据被储存在了缓冲区,因为它是在缓冲区存完再识别,缓冲区并未清理干净,所有需要cin.ignore()去专门清理缓冲区,而cin.ignore()用法如下
在 C++ 中,<limits>
头文件提供了 std::numeric_limits
模板类,用于获取各种数据类型的极值(如最大值、最小值)。它是处理数值边界和流操作时的重要工具,尤其在输入输出中用于安全地控制缓冲区。 标准形式是 numeric_limits<要获取的数据类型>::里面函数
在上面代码中 numeric_limits<stream>::max() 其意思为表示在流类型里面能表示的最大的数字,即对缓冲区里面所有内容通通升天超度掉(清空)
#include <limits>
using namespace std;numeric_limits<T>::max(); // 类型 T 的最大值
numeric_limits<T>::min(); // 类型 T 的最小值(整数为最小负值,浮点为最小正值)
numeric_limits<T>::lowest(); // 类型 T 的最小值(浮点的负无穷方向)
numeric_limits<T>::epsilon(); // 浮点类型的精度(机器 epsilon)
当然,也能更简单
ignore里面第一个参数填要清空的字符串数量,第二个参数填结束位置以识别到\n换行结束
不要忽略我上面讲的 cin.fail()和 cin.clear() 和 cin.ignore()
的用法,之后你刷字符串的题目,你到时候看一些大神的解法还会回来的
2,经过上面讲解,相信你已经快领悟到字符串的秒处了,接下来,还有更重要的#include<sstream>
C++ 中的 <sstream>
头文件提供了字符串流(String Stream)功能,允许将字符串作为流来处理,实现内存中的格式化输入输出操作。它比 C 风格的 sscanf
/sprintf
更安全、更灵活,是处理字符串与数据类型转换的利器。
这对于作者来说,将这个有许多难度,之后再总结后会发在第二期 ,真的对不起