C++字符串操作【超详细】

零.前言

本文将重点围绕C++的字符串来展开描述。

其中,对于C/C++中字符串的一些区别 也做出了回答,并对于C++的(string库 )进行了讲解,最后我们给出字符串的不同表达形式

开发环境

VS2022

一.字符串常量跟字符串变量

1.1字符串常量

字符常量是什么呢?顾名思义就是一段已经在内存中确定下来的字符串,并且这块内存中的字符串无法改变。

例如:"ABC"、"ASD233"、"sdasd16.."等等都是字符串常量

在C++中使用:

#include<iostream>
using namespace std;

int main()
{
	cout << "abc" << "是一个字符串常量" << endl;	//abc是一个字符串常量
}

1.2字符串变量:

对于字符串变量,在C++中有三种实现方式:"数组"、"指针变量"、"string类对象"。

数组:

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	char eg1[10] = "abc";    //直接初始化
	char eg2[10];    //后面通过输入初始化
	cin >> eg2;	//此处输入def
	cout << eg1 << endl;	//abc
	cout << eg2 << endl;	//def
}

运行结果:

指针变量:

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	char eg1[10] = "abc";	//数组
	char *eg2 = eg1;		//指针变量
	cout << eg1 << endl;	//abc
	cout << eg2 << endl;	//abc
}

运行结果:

string类对象:

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1 = "123";	//利用"="来初始化
	string s2("456");	//利用"()"来初始化,和上面本质一样
	string s3 = s1;		//利用"string"类对象来初始化
	string s4(s2);		//和上面本质一样
	char eg[10] = "abc";
	string s5 = eg;		//利用"eg数组"来初始化
	cout << s1 << endl;	//123
	cout << s2 << endl;	//456
	cout << s3 << endl;	//123
	cout << s4 << endl;	//456
	cout << s5 << endl;	//abc
}

运行结果:

二.字符串的读取

为方便起见,后续的所有字符串都将以string类对象的形式进行讲解。

2.1cin函数

没啥好说的,最简单也是最开始学习到的读取函数,可以读取字符串,遇到"空格"、"回车"、"Tab"等制表格符号****结束读取。

ps: "不会读取空格,空格并不会被存储!!!"

例如:

cpp 复制代码
#include<string>
using namespace std;

int main()
{
	string s;
	cin >> s;	//在这里输入ABC
	cout << s << endl;	//输出ABC
	cin >> s;	//在这里输入A B C
	cout << s << endl;	//输出A
}

运行结果:

2.2getline()函数

getline 函数相对于cin 函数最大的区别在于"getline可以读取空格,遇到回车才结束"

getline()函数格式:

getline(cin,变量名)

例如:

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s;
	getline(cin, s);	//这里输入A B C D
	cout << s << endl;	//输出A B C D
}

运行结果:

2.3cin.getline()函数

**cin.getline()函数可以理解为是getline()**函数的"超集"。

getline函数读取的是"string流(字符串流)"。

cin.getline函数读取的是"iostream流(输入输出信息流)"。

cin.getline函数遇到"空格"也会读取,不过跟getline函数最大的区别是"cin.getline()"函数可以指定读取的字符个数!!

**cin.getline()**函数格式:

cin.getline(变量名,读取字符的个数,结束字符)

其中,前两个参数必须有,第三个参数可以没有,默认为'\0'

PS:"cin.getline()函数只能给'数组'形式的字符串使用,而getline()函数只能给'string类对象'形式的字符串使用"

例如:

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	char s[10];
	cin.getline(s,3);	//输入ABCD
	cout << s << endl;	//输出AB,原因在于最后一个字符存储了'\0',因此把C挤掉了。
}

运行结果:

getline()和cin.getline()错误示例:

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	char eg1[10];
	string eg2;
	cin.getline(eg2, 5);	//报错,cin.getline()函数只能给'数组'形式字符串使用
	getline(eg1);			//报错,getline()函数只能给'string类对象'形式字符串使用
}

三.string类对象的操作

3.1string类对象字符串拼接、比较操作

"+ "、"> "、"< "、">= "、"<= "、"!= "、"== "等符号在string类对象中都是允许的,具体规则如下:

"+":

"+"被用于两个字符串对象相加(首尾拼接)

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1 = "ABC";
	string s2 = "DEF";
	cout << s1 + s2 << endl;	//输出ABCDEF
}

"=="、"!=":

"== "被用于比较两个字符串是否相等(区分大小写、区分位置 )

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1 = "ABC";
	string s2 = "ABC";
	string s3 = "abc";
	string s4 = "CBA";
	if(s1 == s2)
		cout << "s1,s2两个相等" << endl;
	else
		cout << "s1,s2两个不相等" << endl;
	//输出相等
	if(s1 == s3)
		cout << "s1,s3两个相等" << endl;
	else
		cout << "s1,s3两个不相等" << endl;
	//输出不相等
	if(s1 == s4)
		cout << "s1,s4两个相等" << endl;
	else
		cout << "s1,s4两个不相等" << endl;
	//输出不相等
}

运行结果:

"!= "被用来比较两个字符串是否"不相等"(区分位置、区分大小写

道理和上面的"=="一样,在这里就不赘述了。

"> "、"< "、">= "、"<=":

这四个符号用来给字符串进行大小 比较(依照字典序进行比较)

字典序:

a > b >c > ... > z > A > B > C > ... > Z

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1 = "aB";
	string s2 = "AB";
	if (s1 > s2)
		cout << "s1>s2" << endl;
	else
		cout << "s1<s2" << endl;
	//输出s1>s2
}

ps:"按照字典序从第一个位置开始挨个比较"

例如"bA"大于"Ba",那是因为b在第一个位置并且大于B,尽管后面的A小于a,但那是第二个位置了。

"位置的优先级 > 字典序的优先级"

3.2string类对象常见函数

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABC";
	cout << s.empty() << endl;	//判断s是否为空,为空返回Ture(1),不为空返回False(0)
	cout << s.length() << endl;	//计算s的字符串长度
	cout << s.size() << endl;	//同上
	cout << s[2] << endl;	//跟字符数组一样,利用下标索引访问字符串中某个字符
	cout << s[3] << endl;	//空字符也是存在的,这里就输出空字符'\0'
	//运行结果//
    0
    3
    3
    C
    '\0',其实这个空字符在cmd命令控制窗口中就是一个空白.
}

运行结果:

3.3修改string类对象的操作

3.3.1insert函数->插入:

s.insert(pos,k):

在字符串s下标索引pos之前插入字符串k

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABC";
	s.insert(2, "66");
	cout << s << endl;	//输出AB66C
}

3.3.2erase函数->删除:

erase(pos,len):

删除从 pos 开始的 len 个字符(包括位置pos)。如果 len 省略,则删除 pos 开始的后面所有字符。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCDEF";
	s.erase(2, 2);
	cout << s << endl;	//输出ABEF
}

3.3.3replace函数->替换:

s.replace(start,len,rp):

将字符串s中下标索引start开始共len个字符替换为字符串rp。

其中,删除的字符数量可以和要替换的字符串rp的长度不一致。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCD";
	s.replace(1, 2, "6666");
	cout << s << endl;	//输出A6666D
}

3.3.4find函数->查找:

s.find(st):

在字符串s中查找字符串st第一次出现的位置,返回下标索引。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCDEFAB";
	cout << s.find("AB") << endl;	//输出0
}

3.3.5rfind函数->查找:

s.rfind(st):

在字符串s中查找字符串st最后一次出现的位置,返回下标索引。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCDEFAB";
	cout << s.rfind("AB") << endl;	//输出6
}

3.3.6reverse函数->反转字符串:

s.reverse(start,end):

将字符串s下标索引[start,end]之间的字符串反转

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCDEF";
	reverse(s.begin(), s.end());
	cout << s << endl;	//FEFCBA
}

3.3.7substr函数->截取字符串:

s.substr(pos,len):

将字符串s从下标索引pos开始连续截取len个长度的字符串。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s = "ABCDEF";
	string ss = s.substr(1, 3);
	cout << ss << endl;	//BCD
}
相关推荐
不是仙人的闲人23 分钟前
Qt 常用数据类型
开发语言·c++·qt
近听水无声4771 小时前
C / C++的内存管理
c++
panamera121 小时前
linux下日志系统setvbuf接口及结构体 handle_file_t成员介绍
linux·服务器·开发语言·网络·c++·算法
gezhengxu2024(已隕落)1 小时前
c++ pair
开发语言·c++
小乌龟不会飞1 小时前
【C++】检测TCP链接超时——时间轮组件设计
运维·服务器·c++·时间轮
我不会起名字呀2 小时前
c/c++八股文
java·c语言·c++
轩辰~2 小时前
设计模式之代理
c++·设计模式
9毫米的幻想4 小时前
【C++】—— stack & queue & deque
android·java·c语言·开发语言·c++·学习
极地星光6 小时前
设计模式-策略模式
c++·设计模式·策略模式