string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作,标准库string类型的目的就是满足对字符串的一般应用。
与其他的标准库类型一样,用户程序要使用string类型对象,必须包含相关头文件。如果提供了合适的using声明,那么编写出来的程序将会变得简短些:
#include<string>
using std::string;
-
string对象的定义和初始化 string标准库支持几个构造函数。构造函数是一个特殊成员函数,定义如何初始化该类型的对象。当没有明确指定对象初始化时,系统将使用默认构造函数。
几种初始化string对象的方式:
string s1; //默认构造函数,s1为空串
string s2(s1); //将s2初始化为s1的副本
string s3("value") //将s3初始化为一个字符串字面值副本
string s4(n, 'c') //将s4初始化为字符‘c’的n个副本
-
读入未知数目的string对象
和内置类型的输入操作符一样,string的输入操作符也会返回所读的数据流。因此,可以把输入操作作为判断条件,下面的程序将从标准输入读取一组string对象,然后在标准输出上逐行输出:
int main() { string word; //read until end-of-file, writing each word to a new line while (cin >> word) { cout << word << endl; } return 0; }上例中,用输入操作符来读取string对象,该操作符返回所读的istream对象,并在读取结束后,作为while的判断条件。如果输入流是有效的,即还未达到文件尾且未遇到无效输入,则执行while循环体,并将读取的字符串输出到标准输出。如果到达了文件尾,则跳出while循环。
-
用getline读取整行文本 getline函数接受两个参数,一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包含换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个字符,get也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。 getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。例如,重写前面那段程序,把每行输出一个单词改为每次输出一行文本。
int main()
{
string line;
while (getline(cin, line))
{
cout << line << endl;
}
return 0;
}
由于line不包含换行符,若要逐行输出需要自行添加。照常,我们用endl来输出一个换行符并刷新输出缓冲区。
-
string对象的操作
s.empty() 如果s为空串,则返回为true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s中位置为n的字符,位置从0开始计数
s1+s2 把s1和s2连接成一个新字符串,返回新生成的字符串
s1 = s2 把s1的内容替换为s2的副本
v1 == v2 比较v1与v2的内容,相等则返回为true,否则返回false
!=, <, <=, >和>= 保留这些操作符惯有的意义
-
string::size_type类型
string类类型和许多其他库类型都定义了一些配套类型。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。它定义为与unsigned型具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。
-
string对象中字符的处理
我们经常要对string对象中的单个字符进行处理,例如,通常需要知道某个特殊字符是否为空白字符、字母或数字。这些函数都在cctype头文件中定义。
isalnum(c) 如果c是字母或数字,则为true
isalpha(c) 如果c是字母,则为true
iscntrl(c) 如果c为控制字符,则为true
isdigit(c) 如果c为数字,则为true
isgraph(c) 如果c不是空格,但可打印,则为true
islower(c) 如果c是小写字母,则为true
isprint(c) 如果c是可打印字符,则为true