18.3 字符串的输入输出
C风格字符串的输入方式大致有“>>”、“cin.getline()”和“cin.get()”3种,对string字符串来说,除了重载“>>”实现输出外,string头文件还定义了getline函数用以输入string字符串,抛弃了“cin.getline()”和“cin.get()”两种输入方式,原因在于getline外部函数能自动调整目标string的大小,使其能恰好存储输入的字符。
注意
>>输入同样会自动调整string对象的大小。
外部getline函数第1个参数必须为输入流对象,第2个参数是待输入的string对象,第3个参数是分界符,getline函数将输入流中的字符存储到string变量中,直到满足下列条件之一为止。
❑到达文件尾,此时输入流的eofbit置位有效。
❑遇到分界字符,默认为换行符'\n'。此时分解符会从流中删除,但并不会存储到string对象中。
❑读取的字符达到最大允许值(string类中的常量npos决定了string所能存储的最大字符数,一般都很大,不会对输入产生影响,另一个因素是可用内存字节数,因此,最大允许值便是从npos和可用内存字节数中选取较小的一个),输入流的failbit置位有效。
如示例代码18.2所示。
代码18.2 string字符串输入StringInput
<—————————————-文件名:example1802.cpp—————————————-> 01 #include<iostream> 02 #include<string> 03 using namespace std; 04 int main() 05 { 06 string str1("Hello,C++");//使用字符串初始化 07 string str2;//建立空字符串 08 cout<<"请输入str1"<<endl; 09 cin>>str1;//输入str1 10 cout<<"请输入str2"<<endl; 11 getline(cin,str2,'!');//输入str2 12 cout<<"您输入的是:"<<endl; 13 cout<<str1<<endl; 14 cout<<str2<<endl; 15 return 0; 16 }
输出结果如下所示。
请输入str1 ABC(注:键盘输入) 请输入str2 ILoveChina!Beijing(注:键盘输入) 您输入的是: ABC ILoveChina
【代码解析】代码第6~7行首先声明了两个字符串str1和str2,其中str1用C风格字符串进行了初始化,而str2是个空字符串,语句“cin>>str1;”对str1进行输入,从结果可以看出,执行输入操作时,str1中原有内容被清空,只保留新输入的内容“ABC”。代码第11行的语句“getline(cin,str2,'!')”采用外部getline函数对str2进行输入,以感叹号为分界符,所以输入的“ILoveChina!Beijing”只保留了感叹号之前的部分“ILoveChina”。
细心的读者可能注意到,输出结果中,在“ABC”和“ILoveChina”之间有个空行,这个换行符实际上是str2的第1个字符,根据前面的内容可知使用>>执行输入操作时,遇到换行符输入结束,但换行符留在输入缓冲区中,因为getline函数设定了分界符为感叹号,所以此换行符读入到str2中,如果getline中采用默认的分界符(即换行符),str2将为空,读取不到任何字符。