
前面介绍了通过字符数组保存字符串,然后对字符数组中的字符串做各种操作
char str[20] = "hello world";为了更加简单方便,在 C++ 中,又增加了 string 来处理字符串。
string 字符串其实是一种更加高级的封装,string 字符串中包含大量的方法,这些方法使得字符串的操作变得更加简单。string 使用的好,慢慢你就不想使用字符数组来存放字符串了。所以这一章要好好的理解并且能够更好的使用 string。
什么是string呢?
而 C++ 中将字符串直接作为一种类型,也就是 string 类型,使用 string 类型创建的对象就是 C++ 的字符串。
string s1;
string s2 = "abc";使用 C++ 中提供的 string 时,必须添加头文件 < string >
string 文档:https://legacy.cplusplus.com/reference/string/string/
方式 | 解释 |
|---|---|
string s1 | 创建空字符串 |
string s2 = “hello world” | 创建字符串(常用) |
代码示例:
#include <iostream>
using namespace std;
#include <string>
int main()
{
string s1;
string s2 = "hello world";
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
return 0;
}结果演示:

创建字符串的方式与前面学习到创建内置数据类型的方式相同,只是这里的字符串类型为 string。


上面这个图,仅仅是字符串 s2 的示意图,实际上 string 类型的字符串比这个要复杂的多,更多的知识得学习 C++ 的类和对象的知识才能明白。
除了以上创建字符串的写法外,C++ 中还有一些其他的创建字符串方式。如:
string s("hello world"); //等同于string s1 = "hello world";
string s1 = s; //用一个现成的字符串s,初始化另外一个字符串s1演示结果:

当然 C++ 中的 string 创建的字符串和 char 类型的数组所表示的字符串还有一个区别,string 类型的字符串对象可以直接赋值,比如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1("hello world");
string s2("hehe");
s2 = s1;
cout << s2 << endl;
return 0;
}演示结果:

但是如果是数组的话:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char arr1[] = "hello world";
char arr2[] = "hehe";
arr2 = arr1;
cout << arr2 << endl;
return 0;
}演示结果:

会发现报错。这是因为数组名是首元素地址,地址是常量,不可改。
可以直接使用 cin 给 string 类型的字符串中输入一个字符串的数据。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
//输入
cin >> s;
//输出
cout << s << endl;
return 0;
}输入不带空格的字符串:

输入带空格的字符串:

这里我们可以发现,其实 cin 的方式给 string 类型的字符串中输入数据的时候,可以输入不带空格的字符串。但是如果带有空格,遇到空格也就读取结束了,没有办法正常读取,那怎么办呢?解决办法就是使用 getline。
getline 文档:https://legacy.cplusplus.com/reference/string/string/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 给第一个参数。
getline(cin, string str)
//cin -- 表示从输入流中读取信息
//str 是存放读取到的信息的字符串这种形式的 getline 函数从输入流(例如 cin)中读取文本,直到遇到换行符(‘\n’)为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型的变量 str 中。
#include<iostream>
#include <string>
using namespace std;
int main ()
{
string name;
getline (cin, name);
cout << name << endl;
return 0;
}演示结果:

getline(cin, string str, char delim)
//cin -- 表示从输入流中读取信息
//str 是存放读取到的信息的字符串
//delim 是自定义的结束标志这种形式的 getline 函数从输入流中读取文本,直到遇到用户指定的结束标志字符(delim)为止,然后将读取到的文本(不包括结束标志字符)存储到指定的 string 类型的变量 str 中。
#include<iostream>
#include <string>
using namespace std;
int main ()
{
string name;
getline (cin, name, 'e');
cout << name << endl;
return 0;
}演示结果:

提示: 在使用 C++ 中的 string 字符串时,想要输入的字符串中包含空格,那么 getline 函数就是必须的。在竞赛中为了方便处理字符串,通常会使用 string 类型的字符串,所以在字符串输入的时候 getline 就很常见,建议认真学习。
size() 文档:https://legacy.cplusplus.com/reference/string/string/size/
string 中提供了 size() 函数用于获取字符串长度。
在 C++ 中关于字符串的操作函数都是包含在 string 中的,所以需要调用这些函数时,通常用 . 点运算符。
使用示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
string s1 = "hello";
string s2 = "hello world";
string s3 = "12ab!~ ";
cout << "s:" << s.size() << endl;
cout << "s1:" << s1.size() << endl;
cout << "s2:" << s2.size() << endl;
cout << "s3:" << s3.size() << endl;
return 0;
}演示结果:

小提示: 前面我们学到的像 char、int、double 等内置类型的数据在操作的时候,不会使 用
.操作符的。 string 是 C++ 提供的一种更加复杂的封装类型,在 string 类型的变量中加入了操作这 个字符串的各种方法(函数),比如求字符串长度、字符串末尾插入一个字符等操作。所以要对 string 类型的变量进行各种操作,就可以使用.操作符来使用这些函数。 我们可以看下面的例子,大家要仔细体会。
通过 size() 能获得字符串的长度,顺便就可以使用这个长度遍历字符串的,注意 string 类型的字符串是可以通过下标访问的,比如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdef";
int i = 0;
for(i = 0; i < s.size(); i++)
{
cout << s[i] << " ";
}
return 0;
}演示结果:


iterator 的官方网址:https://legacy.cplusplus.com/reference/string/string/

迭代器是一种对象,它可以用来遍历容器(比如我们现在学习的string)中的元素,迭代器的作用类似于指针,或者数组下标。
访问迭代器指向的值,需要解引用(*)。到后面讲解到指针部分就明白了
C++ 中的 string 提供了多种迭代器,用于遍历和操作字符串中的内容。这里给大家介绍一种最常用的迭代器。
string s = "abcdef";
提示:
前面的迭代器 < 后面的迭代器
比如:it++,就是让迭代器前进一步,it-- 就是让迭代器退后一步。#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdef";
string::iterator it1 = s.begin();
string::iterator it2 = s.end();
cout << (it1 < it2) << endl;
cout << it1 - it2 << endl;
return 0;
}演示结果:

迭代器通常用于遍历字符串的,可以正序遍历,也可以逆序遍历。
正序遍历:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdef";
//auto it 是让编译器自动推到it的类型
for (auto it = s.begin(); it != s.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
//string::iterator 是正向迭代器类型
//string::iterator it,是直接创建迭代器,it是针对字符串的迭代器
for (string::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << ' ';
}
return 0;
}演示结果:

逆序遍历:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "abcdef";
for (string::iterator it = s.end() - 1; it >= s.begin(); --it)
{
cout << *it << ' ';
}
return 0;
}演示结果:


通过迭代器找到元素后,改变迭代器指向的元素,是可以直接改变字符串内容的。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "abcdef";
cout << str << endl;
for (string::iterator it = str.begin(); it < str.end(); ++it)
{
*it = 'x';
}
cout << str << endl;
return 0;
}演示结果:

占时就讲这么多,后面一章将对 string 相关内容全部讲完,并对以前的相关习题进行分析解答。
愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。