文章目录
简介:
头文件: #include<string>
一个专门存储和处理字符类型的容器, 具有强大的功能,拥有丰富的函数,可以让我们在进行字符串操作的时候提供很大的帮助。max_size()函数求出其最多可以有大概40亿的长度,string的用法其实非常多,没有重点也就失去了价值,这里只列举常用的~。
由于字符转常常伴随读入操作,因此在重点介绍一下读操作,比如数据包含空格…
1.定义:
string str, str1;
//定义空 string 容器
string str3 = "abcde";
//定义新容器, 将 “abcde” 作为初值
string str6{ 'a','b','c','d','e' };
//几乎不用
string str9 = str;
//这里注意我们是可以直接用等号的~很方便(string str8(str);这样也行
string str5(5, '1');
//结果为"11111"
2.用string进行输入(字符有空格或tab)
2.1 cin
cin遇到空格,tab,回车键就结束读入。这个特点决定了cin不能输入带空格,tab ,enter的字符。那么需要解决这个问题我们引入了getline()这个函数。
2.2 getline()
getline()是一个面向行的函数。用来完成一行数据的读入,以enter或者指定数目的字符结束读入
用法一:
读入整行,遇到回车结束
string s;
getline(cin,s);
用法二:
cin.getline(字符数组名,接收长度,结束符)
char name[256];
cin.getline(name, 256,'*');
2.3 gets
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取。但换行符会被丢弃,然后在末尾添加’\0’字符。
2.4 getchar()
读入一个字符,以enter结束。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在缓冲区。它可以单独使用,不像上面的必须要读进一个变量中
2.5 scanf
用%[^\n]表示读到换行符停下
scanf("%[^\n]",&str);
3.string中操作符的使用
3.1 比较
string字符串支持常见的比较操作符(>,>=,<,<=,==,!=)比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符(ASCII码)的比较结果确定两个字符串的大小
比如: A > BAAAAAAAA 或者 ABAAAAA<AACCCCC
3.2 还可以用’+'实现字符串拼接:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s2 = "abc";
s2 += "def";
cout<<"s2:"<<s2<<endl; // s2:abcdef
string s3="abc";
string s4="def";
s3+=s4;
cout<<"s3:"<<s3; // s2=3:abcdef
return 0;
}
结果:
4.常用函数:
4.1 string的插入函数:push_back() 和 insert()
push_back(char):尾插一个字符
insert(pos,char):在指定的位置pos前插入字符char,需要注意的是我们只能用迭代器来指定位置
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1;
// 尾插一个字符
s1.push_back('a');
s1.push_back('b');
s1.push_back('c');
cout<<"s1:"<<s1<<endl; // s1:abc
// insert(pos,char):在指定的位置pos前插入字符char
s1.insert(s1.begin()+1,'1');
cout<<"s1:"<<s1<<endl; // s1:1abc
return 0;
}
4.2 string的删除:erase()
我们还是用迭代器来删除,而不能直接使用下标
1. iterator erase(iterator p);//删除字符串中p所指的字符
2. iterator erase(iterator first, iterator last);//删除字符串中迭代器
区间[first,last)上所有字符
3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引
位置pos开始的len个字符
4.3 string的查找:find
string查找不仅能查找字符还能查找字符串,还能从指定位置开始找,从后往前找find->rfind,总之功能强大。
- 下标都是从0开始的,没找到都返回-1
- 在查找字符串的时候,成功返回字符串一个字符下标
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 1. 查找一个字符串
cout << s.find("chicken") << endl; // 结果是:9
// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
//从头开始0就可以不写
cout << s.find('i',6) << endl; // 结果是:11
// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
cout << s.rfind("chicken") << endl; // 结果是:9
// 4. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl; // 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符
return 0;
}
4.4 string的截取字符串:substr()
s.substr(pos, len)
注意下标也是从0开始
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
异常 : 若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则只拷贝到string的末尾
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s="sfsa";
string a=s.substr(0,3);
string b=s.substr();
string c=s.substr(2,3);
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
return 0;
}
4.4 其他
size()和length():返回string对象的字符个数,他们执行效果相同。
max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
begin(); //begin()函数返回一个迭代器,指向字符串的第一个元素.
end() //end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
甚至还可以进行排序:sort(s.begin(),s.end()); ~~~~