# string 很多时候都要处理字符串,C在标准库string.h中提供了一系列的字符串函数,string类是由头文件string支持的。要使用类关键在于知道它的公有接口,string类库中包含大量的方法,其中包含若干的构造函数,用于将字符串赋给变量、合并字符串、比较字符串和访问给个元素的重载运算符,以及在字符串中查找字符串和子字符串的工具。 ## 构造字符串 string的构造函数是最重要的内容之一,通过各种方式来创建和初始化对象。NBTS(null-terminated string)是以空字符结束的字符串的缩写,也就是C风格字符串。 | 构造函数 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | `string(const char * s)` | 将string对象初始化为s指向的NBTS | | `string(size_type n, char c)` | 创建一个包含n个元素的string对象,其中每个字符串都被初始化为字符c | | `string(const string & str)` | 将一个string对象初始化为string对象str,复制构造函数 | | `string()` | 创建一个默认的string对象,长度为0,默认构造函数 | | `string(const char * s, size_type n)` | 将string对象初始化为s指向的NBTS的前n个字符,即使超过了NBTS的结尾 | | `template`
`string(Iter begin, Iter end)` | 将string对象初始化为区间[begin, end)内的字符,其中begin和end的行为就像指针,用于指定位置,范围包括begin在内,但不包括end。 | | `string(const string & str, size_type pos=0, size_type n=npos)` | 将一个string对象初始化为对象str中从位置pos开始到结尾的字符,或从位置pos开始的n个字符。 | | `string(string && str) noexcept` | C++11新增,将一个string对象初始化为string对象的str,并可能修改str | | `string(initializer_list) il` | C++11新增,将一个string对象初始化为初始化列表il中字符 | ## string类输入 对于C风格字符串,有三种方式: ```C++ //1 char info[100]; cin >> info[100]; //2 read a line, discard \n cin.getline(info, 100); //3 read a line, leave \n cin.get(info, 100); ``` 对于string对象,有两种方式: ```C++ //1 string str; cin >> str; //2 read a line, discard \n getline(cin, str); ``` 两个版本的`getline()` 都有一个可选参数,用于指定使用哪个字符串来确定输入的边界。 ```C++ cin.getline(info, 100, ':'); //read up to :, discard : getline(str, ':'); //read up to :, discard : ``` 它们之间的主要区别在于,string版本的`getline()`将自动调整为目标string对象的大小,使之能够存储输入的字符。 ## 使用string 成员函数 - `length()` - `size()` 与`length()` 一样 - `find()` 方法有四个重载版本 | 方法原型 | 描述 | | ----------------------------------------------------------- | ------------------------------------------------------------ | | size_type find(const string & str, size_type pos=0) const | 从字符串的pos位置开始,查找字符串str。如果找到,则返回字符串首次出现时其首字母的索引;否则,返回string::npos。 | | size_type find(const char* s, size_type pos=0) const | 从字符串的pos位置开始,查找子字符串s。如果找到,则返回该字符串的首次出现时其首字母的索引;否则,返回string::npos。 | | size_type find(const char* s, size_type pos=0, size_type n) | 从字符串的pos位置开始,查找s的前n个字符组成的子字符串。如果找到,则返回该字符串的首次出现时其首字母的索引;否则,返回string::npos。 | | size_type find(char ch, size_type pos=0) const | 从字符串的pos位置开始,查找字符ch。如果找到,则返回该字符首次出现的位置;否则,返回string::npos。 | - `rfind()` - `find_first_of()` - `find_last_of()` - `find_first_not_of()` - `find_last_not_of()`