string

构造string

1
2
3
4
5
string str1("hello"); //hello
string str2("hello",2);//指定字符串的前2个字符 //he
string str3(str1, 2);//从下标2开始的字符的拷贝 //llo
string str4(str1, 2, 2);//从下标2开始的2个字符的拷贝 //ll
string str5(5,'a');//5个字符a //aaaaa

访问string

虽然at和operator[]都可以获取指定下标的字符,但at有越界检查,发现越界时(pos >= size())会抛出异常std::out_of_range ,operator[]没有越界检查,当越界时行为未定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
string str1("hello");
cout << str1.front() << endl;//获取string的首字符,h
cout << str1.back() << endl;//获取string的尾字符,o
cout << str1[1] << endl;//获取下标为1的字符,e
cout << str1.at(2) << endl;//获取下标为2的字符,l
cout << str1.data() << endl;//返回指向字符串首字符的指针,C++11前不一定是以空字符终止的,C++11后是空字符终止的
cout << str1.c_str() << endl;//返回指向字符串首字符的指针(空字符终止的)
cout << str1.substr(1,2) << endl;//返回从下标1开始的2个字符,el,参数1默认值为0,参数2默认值为size()-第一个参数值
cout << str1.substr() << endl;//hello
cout << str1.substr(3) << endl;//lo
cout << str1.size()<< endl;//5,size()和length()无区别,都返回字符数量
cout << str1.length() << endl;//5
cout << boolalpha << str1.empty() << endl;//判断字符串是否为空

操作string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
string str1("hello");
string str2(" world");
auto str3 = str1 + str2;//连接两个string,hello world
auto str4 = str1 + " xiao ming";//连接string和字符指针,hello xiao ming
str3.assign("12345678");//赋值为12345678
str3.clear();//清空所有字符
str3.append("222");//追加字符串
str3.insert(1, "abc",3);
cout << str3<<endl;//2abc22
str3.replace(1, 3,"defg");
cout << str3 << endl;//2defg22
str3.erase(1, 4);
cout << str3 << endl;//222
system("pause");
}

查找string

string类提供了6个不同的查找函数,每个函数有4个重载版本,当搜索失败时,返回一个名为string::npos的静态成员,标准库将npos定义为string::size_type类型并初始为-1。当搜索成功时,返回第一个匹配位置的下标。

搜索操作 说明
s.find(args) 查找s中args第一次出现的位置
s.rfind(args) 查找s中args最后一次出现的位置
s.find_first_of(args) 在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args) 在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args) 在s中查找第一个不在args中的字符
s.find_last_not_of(args) 在s中查找最后一个不在args中的字符

args可以使如下形式:

args 说明
c,pos 从s中位置pos开始查找字符c,pos默认为0
s2,pos 从s中位置pos开始查找字符串s2,pos默认为0
cp,pos 从s中位置pos开始查找以空字符结尾的字符数组cp,pos默认为0
cp,pos,n 从s中位置pos开始查找以空字符结尾的字符数组cp的前n个字符,pos和n无默认值