【知识点】C++中的string类型
String类型的定义
基本的C风格定义方法有以下两种:
char *a = "Hello World!";
直接声明指针型变量指向字符串常量,缺点是内容不可变,不灵活;char a[20] = "Hello World!";
声明字符数组并初始化,缺点是最大长度不可变,且相较于string类型灵活性仍较低。
那么就需要定义C++中的std::string类型。
需要先引入头文件string:
#include <string>
using namespace std;
string a = "Hello World!";
int main(){
printf("%s",a.data());
}
或者利用构造函数:
string s; //生成空字符串
string s(str); //生成字符串为str的复制品
string s(str, strbegin,strlen); //将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值
string s(cstr, char_len); //以C_string类型cstr的前char_len个字符串作为字符串s的初值
string s(num ,c) //生成num个c字符的字符串
string s(str, stridx); //将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值
//算法竞赛只需记忆第一二三条即可
string类型的特点是可以动态改变大小。当字符串内容增添时,它会分配更大的内存空间来存储新的字符串。
注意:string类型有'\0'作为结束符,但一般不会对其交互。
String类型的相关操作
其特点是提供了许多非常方便的成员函数。
size()、length()函数
可以直接获得字符串长度,返回值为size_type类型,不包括'\0',用于表示字符串大小。两个函数没有本质区别,可以互换使用。
#include <iostream>
#include <string>
using namespace std;
string a = "Hello World!";
int main(){
cout<<a.length()<<endl;
cout<<a.size()<<endl;
}
输出为
12
12
赋值拷贝
两个string类可以直接用赋值运算符。(免示例)
输入字符串
- cin
cin>>a;
遇到空格、TAB、换行符都会结束。不会读入空字符。 - getline
getline(cin,a);
读取一整行。不会读入换行符。 - scanf(较复杂,不推荐)
a.resize(15); scanf("%[^\n]",&a[0]);
需要先预分配空间,再取首字符地址进行输入。可以正常使用正则表达式。
若用%s,遇到空格、TAB、换行符结束。不会读入空字符。
若用%[^\n],读取一整行。不会读入换行符。
可以指定缓冲区大小,比如%1023s、%1023[^\n]。
比较字符串字典序大小
可以直接使用比较运算符。
#include <iostream>
#include <string>
using namespace std;
string a = "Hello World!";
string b = "Hello World";
int main(){
cout << (a > b) << endl;
}
输出结果为
1
或调用成员函数compare(),其返回值与C语言中strcmp相同。
cout << a.compare(b) << endl;
输出结果仍为
1
字符串连接
可以直接用拼接符'+'连接。
#include <iostream>
#include <string>
using namespace std;
string a = "Hello";
string b = " World!";
int main(){
a = a + b;
cout << a << endl;
}
输出结果为
Hello World!
或使用append()函数。(免示例)
查找、搜索
find()函数,从左往右搜索子串,返回第一个子串首字符索引,如果没有则返回string::npos类型-1;
#include <iostream>
#include <string>
using namespace std;
string a = "Hello";
string b = " World!";
int main(){
a = a + b;
cout << a.find('r') << endl;
cout << a.find(b) << endl;
cout << a.find('?') << endl;
if(a.find('?') == string::npos) cout << -1 << endl;
}
输出结果为
8
5
18446744073709551615
-1
rfind()函数同理,从右往左找子串(免示例)。
替换字符串
replace() 函数可以直接实现替换功能。
三个参数分别为:起始索引、最大替换长度、素材串。
#include <iostream>
#include <string>
using namespace std;
string a = "Hello";
string b = " World!";
int main(){
a = a + b;
a.replace(3,5,"ABCDE");
cout<<a.data();
}
输出结果为
HelABCDErld!
删除子串
erase()函数可以直接实现删除功能。
两个参数分别为:起始索引、删除长度。
#include <iostream>
#include <string>
using namespace std;
string a = "Hello";
string b = " the World!";
int main(){
a = a + b;
a.erase(5,4);
cout<<a.data();
}
输出结果为:
Hello World!

浙公网安备 33010602011771号