在 c 语言中,我们想要存储一连串的字符,只能通过创建一个字符数组的方式。这种方法当然可以,但是我们在使用的时候能够很明显地感觉出来,它并不是那么的方便,像我如果想把两个字符串连接在一起,我肯定如果通过创建字符数组的方式,我肯定不可能直接加和。通常要借助 strcat 这个函数来实现。
C++就使用了另外一种方式去为我们写代码提供便利。也就是创立了一个数据类型,叫做 string。它既不是 char ,也不是字符数组,而是一个单独的数据类型 string。
1.什么是 string
string 字符串其实是⼀种更加⾼级的封装, string 字符串中包含⼤量的⽅法,这些⽅法使得字符串的操作变得更加简单。 string 使⽤的好,慢慢你就不想使⽤字符数组来存放字符串了
这句话你也许现在不理解,但是没有关系,一会你回过头来再看看这句话,你或许就能理解了。
使⽤ C++ 中提供的 string 时,必须添加头⽂件 <string>
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "hello world";
cout << s1 << endl; //输出 Hello world
return 0;
}
2.和字符数组的区别
看了上面的代码,你可能觉得任何字符数组有什么区别吗?只是书写好像更简便一点了,那如果我告诉你它可以直接加和赋值的话,你还会这么想吗?
2.1 加和与赋值
2.1.1 加和代码示例
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "liuqipei";
string s2 = "zjb";
string s3 = s1 + s2;
cout << s3 << endl; //输出liuqipeizjb
return 0;
}
2.1.2 赋值代码示例
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "xxxxxxx";
string s2 = "liuqipei";
s1 = s2;
cout << s1 << endl;
}
3.结尾不再是 \\0
众所周知,你如果去创立一个字符数组,那么编译器会自动的在它结尾加上 \\0作为结束的标志,也方便你在用 cout 或者是 printf 打印的时候能够正常进行,但是你如果用 string 去创立一个字符串,它的结尾并不是 \\0,而就是你输入的最后一个字符

从这里可以看到 s1 这个字符串内容就只包含 liu ,而 arr 则还包含了 \\0
4. string 字符串的输入
既然认识了 string ,那学习如何往 string 里输入内容也是必不可少的,这里介绍两种输入方式 cin 和 getline
4.1 cin
cin 主要用于应付输入的字符串不含空格的情况,具体的使用方法就和字符数组一致
4.2 getline
getline 是 C++ 标准库中的一个函数,用于读取一行文本并将其存储为字符串

看不懂吧? istream 表示输入流类型,cin 是标准输入流,看似符号十分复杂,其实你只要知道当从键盘上给程序输入值的时候,就在这个位置填 cin 就可以了。
第二个符号表示的意思是输入进来的文本将要存储到的位置。
第三个符号是可写可不写的,它表示的意思是读到哪里为止,如果你只输入了两个参数。那他会默认以换行符为终止标志。如果你在这个位置填了一个字符,它将会以这个字符作为终止标志,并且不会存储这个字符。
5.size()
string 提供了 size() 函数用于获取字符串长度。在调用这个函数的时候一般格式是 字符串名.size()
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "Hello world";
int len = s.size(); //字符串名.size()
cout << len << endl; //输出 11
return 0;
}
你可能会觉得为什么会有如此奇怪的调用方式?我们一般解函数的时候像 sizeof 不是直接调用就好了吗?那就是因为这个是 C++在定义 string 的时候单独给 string 封装的一个函数,那 s 作为一个string 类型的字符串,你只要在它后面加上点,然后调用这个函数。有点像我们在结构体调用成员变量的写法。
string 定义的字符串是能够通过下标访问的,那既然 size 能获取字符串长度,那就很方便我们去遍历字符串了。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "abcde";
for(int i = 0; i < s1.size(); i++)
{
s1[i] = 'x'; // 输出xxxxx
}
cout << s1 <<endl;
}
6.迭代器(iterator)
迭代器是一种对象。它可以用来遍历数组。他在很多地方类似于指针,或者说是数组下标。
C++的 string 中提供了多种迭代器,这里先给大家介绍两种最常见的。
6.1 begin() 和 end()
begin() :返回指向字符串第一个字符的迭代器。需要一个迭代器的变量来接收
end() :返回指向字符串最后一个字符后一个位置的迭代器,该位置不属于字符串。

string 返回的迭代器类型为 string::iterator,没看懂,没有关系,你只需要把迭代器当做你新学过的一种类型。然后看我的代码演示它是如何使用的。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "abcde";
string::iterator it1 = s.begin();
string::iterator it2 = s.end();
cout << it2 – it1 << endl; //输出5
return 0;
}
迭代器这个类型,它不仅可以相加相减,也可以加一个整数让它向前移位,或者是减去整数向后移位。同样也可以进行大小的比较
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "abcde";
for(string::iterator i = s.begin(); i < s.end(); i++)
{
cout << *i; //迭代器类似指针,如需指向具体的值需要解引用
} //输出 abcde
}
如果你觉得你已经理解了,不妨试着通过迭代器的方式执行一下逆序打印,我写的放在文章结尾
既然迭代器的作用类似指针,那也可以通过它来改变字符串内容本身
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "abcde";
for(string::iterator i = s.end(); i >= s.begin(); i–)
{
*i = 'x';
}
cout << s << endl; //输出 xxxxx
}
逆序打印
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "abcde";
for(string::iterator i = s.end(); i >= s.begin(); i–)
{
cout << *i ;
}
}




