第八节说明了数组的使用,我们可以使用字符类型的数组,本节课来对C++的字符串简单的说明与应用。这里给一个简单的说明:生活中我们使用的软件或app中常常都时以字符的形式存储数据,字符串使用的频率非常高,所以C++针对字符串专门编写了一个库。我们导入字符串的库后便可以使用库里提供的方法。
1、创建、查看、字符串长度(注意我们在前面的章节说明过sizeof运算符,请予以区别)
#include <iostream>
#include <string>//有使用可以看到cstring或者string.h这是C语言的库非C++的库
using namespace std;
string str;//创建一个string类型的变量
int main()
{
//由于字符串我们先前是不知道长度的,就好比你注册一个账号开始网站或平台也不知道
//你要起什么昵称
cin >> str;
int length = str.size()//变量对象使用库提供的方法读取这个字符串的长度
cout << length << endl;
cout << str << endl;
//也可以通过像字符数组一样的方式遍历甚至特殊的查找,注意字符串的下标也是从0开始
for(int i = 0; i < length; ++i)
cout << str[i];
cout << endl;
return 0;
}
这里应该就能想到比字符数组方便的地方,如果库方法足够多足够全我们就能轻松又省事的调用他所提供的方法就好。
注意:
1)单个单词使用cin,由于cin读取并忽略开头全部的空白字符(如空格、换行符、制表符)。读取字符直至再次遇到空白符,读取终止。所以cin仅仅能读取单个单词并可以多次使用cin来获取多个单词。
2)多个单词使用getline(cin, string)读取,示例代码如下:
#include <iostream>
#include <string>
using namespace std;
string str;
int main()
{
//不断读取,知道文件结束为止,简单讲结束条件由C++内部机制处理判断
while(getline(cin, str))
{
cout << str << endl;
}
return 0;
}
这个函数接受两个参数:一个输入流对象和一个 string 对象。getline 函数从输入流的下一行读取,并保存读取的内容到不包含换行符。和输入操作符不一样的是,getline 并不忽略行开头的换行符。仅仅要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。假设第一个字符就是换行符,则 string 參数将被置为空 string。因为getline函数返回时丢弃换行符,换行符将不会存储string对象中。
2.字符串的子串:简单的理解就是字符串中某一连续小段就是其字符串的子串;例如:字符串cplusplusisverysmart中sis是其子串,plus也是其子串,其本身也算其子串。获得子串的方法:substr(position, number);第一个参数position就是从哪个位置开始提取其子串,number就是向后取多少个(包括起始位置)。
#include <iostream>
#include <string>
using namespace std;
string str;
int pos, num;
int main()
{
//字符串用双引号包含起来
str = "cplusplusisverysmart";
cin >> pos >> num;
//获得其子串并输出
cout << str.substr(pos, num) << endl;
return 0;
}
3.字符串的查找:使用find方法:find(searchstring, position);第一个参数就是要查找的字符串,第二个参数从被查字符串哪里开始查,如果查到了返回第一个子串的位置否则返回-1表示该串中没有要查找的子串。
#include <iostream>
#include <string>
using namespace std;
string str, sstr;
int pos;
int main()
{
//字符串用双引号包含起来
str = "cplusplusisverysmart";
cin >> pos >> substr;
//查找并输出位置
cout << str.find(sstr, pos) << endl;
return 0;
}
4.字符串的插入:使用insert方法:insert(position1, str, position2, n);将str中从pos2位置开始的n个字符插入到当前使用该方法的字符串的pos1位置。(假设n大于str的长度。不会有问题,没有溢出错误;仅仅会拷贝到str的末尾)
#include <iostream>
#include <string>
using namespace std;
string str1, str2;
int pos1, n;
int main()
{
cin >> str1 >> str2 >> pos1 >> n;
//在str1的第三个位置插入第二个字符串第二个位置向后n个字符
cout << str1.insert(3, str2, 2, 6) << endl;
return 0;
}
5.字符串的替换:使用replace方法:replace(pos1, n1, str, n2);从使用函数字符串的第pos1位置开始的长度为n1的字符串替换为str的前n2个字符串。(假设n1太大,从pos到s结尾的全部字符将被替换)
#include <iostream>
#include <string>
using namespace std;
string str1, str2;
int pos1, n;
int main()
{
cin >> str1 >> str2 >> pos1 >> n;
//在str1的第三个位置开始替换为第二个字符串第二个位置向后n个字符
cout << str1.replace(3, str2, 2, 6) << endl;
return 0;
}
补充:C++的string里包含的函数非常多,这里就不一一介绍了,感兴趣的可以查链接:https://pan.baidu.com/s/12JJMME7b9_1fCldUZSQcEQ
提取码:kcp4
习题: https://www.luogu.com.cn/training/104#problems