3.2.2 string对象上的操作(1)
一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。其中,类既能定义通过函数名调用的操作,就像Sales_item类的isbn函数那样(参见1.5.2节,第23页),也能定义<<、+等各种运算符在该类对象上的新含义。表3.2中列举了string的大多数操作。
表3.2: string的操作
|
表3.2: string的操作
|
|
os<<s
|
将s写到输出流os当中,返回os
|
|
is>>s
|
从is中读取字符串赋给s,字符串以空白分隔,返回is
|
|
getline(is, s)
|
从is中读取一行赋给s,返回is
|
|
s.empty()
|
s为空返回true,否则返回false
|
|
s.size()
|
返回s中字符的个数
|
|
s[n]
|
返回s中第n个字符的引用,位置n从0计起
|
|
s1+s2
|
返回s1和s2连接后的结果
|
|
s1=s2
|
用s2的副本代替s1中原来的字符
|
|
s1==s2
|
如果s1和s2中所含的字符完全一样,则它们相等;
string对象的相等性判断对字母的大小写敏感
|
|
s1!=s2
|
|
<, <=, >, >=
|
利用字符在字典中的顺序进行比较,且对字母的大小写敏感
|
读写string对象
第1章曾经介绍过,使用标准库中的iostream来读写int、double等内置类型的值。同样,也可以使用IO操作符读写string对象:
- // 注意:要想编译下面的代码还需要适当的#include语句和using声明
- int main()
- {
- string s; // 空字符串
- cin >> s; // 将string对象读入s,遇到空白停止
- cout << s << endl; // 输出s
- return 0;
- }
这段程序首先定义一个名为s的空string,然后将标准输入的内容读取到s中。在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。
如上所述,如果程序的输入是" Hello World! "(注意开头和结尾处的空格),则输出将是"Hello",输出结果中没有任何空格。
和内置类型的输入输出操作一样,string对象的此类操作也是返回运算符左侧的运算对象作为其结果。因此,多个输入或者多个输出可以连写在一起:
- string s1, s2;
- cin >> s1 >> s2; // 把第一个输入读到s1中,第二个输入读到s2中
- cout << s1 << s2 << endl; // 输出两个string对象
假设给上面这段程序输入与之前一样的内容" Hello World! ",输出将是"HelloWorld!"。
读取未知数量的string对象
1.4.3节(第14页)的程序可以读入数量未知的整数,下面编写一个类似的程序用于读取string对象:
- int main()
- {
- string word;
- while (cin >> word) // 反复读取,直至到达文件末尾
- cout << word << endl; // 逐个输出单词,每个单词后面紧跟一个换行
- return 0;
- }
在该程序中,读取的对象是string而非int,但是while语句的条件部分和之前版本的程序是一样的。该条件负责在读取时检测流的情况,如果流有效,也就是说没遇到文件结束标记或非法输入,那么执行while语句内部的操作。此时,循环体将输出刚刚从标准输入读取的内容。重复若干次之后,一旦遇到文件结束标记或非法输入循环也就结束了。
使用getline读取一整行
有时我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得的结果是个空string。
和输入运算符一样,getline也会返回它的流参数。因此既然输入运算符能作为判断的条件(参见1.4.3节,第14页),我们也能用getline的结果作为条件。例如,可以通过改写之前的程序让它一次输出一整行,而不再是每行输出一个词了:
- int main()
- {
- string line;
- // 每次读入一整行,直至到达文件末尾
- while (getline(cin, line))
- cout << line << endl;
- return 0;
- }