引入
在C语言中,一般使用字符数组char str[]来存放字符串,但是操作麻烦,容易出错。
C++ 在 STL 中加入了 string 类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。
使用方法
定义与初始化
// string的定义
string str;
// string的初始化
string str = "abc"; // 多个小写字母
赋值
// string的定义
string str;
// string的赋值
str = "123"; // 多个数字字符
输入输出
普通读入
cin 读到空格或换行停止
string str;
cin >> str; // 字符串读入
cout << str; // 字符串输出
整行读入
getline(),string 的整行输入,回车键之前的内容都会被记录进 string 里
string str;
getline(cin, str); // 整行读入
cout << str; // 字符串输出
整行读入 特殊情况
整行读入的特殊情况:
若题目的输入格式为:给出一个
n
n
n,表示之后有
n
n
n行,每行给定一个带空格的字符串。样例输入:
4
ab cd
hello world
hhh2
zpr zpr
如果直接按照以下代码:
int n;
string s;
cin >> n;
for(int i = 1; i <= n; i++){
getline(cin, s);
}
会发现只能输入
3
3
3行字符串,原因是输入
4
4
4之后,此时按了一下换行,再输入 ab cd。
这一个换行会被第一个getline读进去,因为它是以换行作为分割的,第一个读入的东西是空白的。
正确的写法:
int n;
string s;
cin >> n;
getline(cin, s); // 这句话读入不到任何信息,只是为了吃掉 n 后面的换行
for(int i = 1; i <= n; i++){
getline(cin, s);
}
字符串拼接
string 字符串之间能通过 “+” 运算进行拼接
string s1 = "abc", s2 = "def";
string s = s1 + s2;
cout << s << endl;
cout << s.size() << endl; // 获取字符串长度
substr函数
截取字符串的一个子串,substr 包含两个参数,第一个参数是开始截取的下标:start,第二个参数是截取的长度 length(很多同学会认为第二个参数是截取的终点,这是错误的,请终重点记忆)。若不写第二个参数,则截取到字符串尾。
函数内部做了保护,如果长度超过了字符串尾,就到字符串尾为止。
string s = "hello";
s.substr(start, length);
insert函数
在字符串的中间插入一个字符串,t.insert(pos, s)
在字符串的 position 位置前面插入一个字符串 s。其中第一个参数是位置,第二个位置是字符串,表示要被插入的字符串。
string s = "hello", t = "world";
s.insert(2, t);
cout << s << endl;
find函数
查找字符串中是否有某一个子串。若能够找到,则返回这个子串起始位置的下标;若不能,则返回一个特别的标记 s.npos。
int main(){
string s = "hello", t = "ll";
if(s.find(t) != s.npos){
cout << s.find(t);
}else{
cout << "t is not exist";
}
}
reverse 函数
// 翻转字符串 s.begin(): 字符串首地址 s.end(): 字符串尾地址的后一位
string s;
cin >> s;
reverse(s.begin(), s.end())
cout << s << endl;
操作总结与扩展
- 以下标的形式访问字符串中的元素:s[i]
- 字符串拼接:+
- 判断字符串 s 是否为空:s.empty()
- 返回字符串 s 中字符个数:s.size()或s.length()
- 截取 s 字符串中从 i 开始,长度为 len 的子串:s.substr(i, len)
- 在字符串 s 的 pos 的位置前插入一个字符串t:s.insert(pos, t)
- 查找在字符串中第一个出现的字符串 t 的位置,查不到返回 4294967295(npos):s.find (t)
- 元素翻转:reverse(s.begin(), s.end())