3.3.3 get()函数和getline()函数
那么如何将含空格的字符串读到C风格字符串中呢?这要用到istream类中提供的getline()和get()函数,两个函数都用于读入一行输入,直至遇到换行符,但getline()函数丢弃了换行符,而get()函数也将换行符存入了C风格字符串中,关于istream类的详细介绍请参考第14章,这里先介绍两个函数的用法,见代码3.5。
代码3.5 get()和getline()的用法GetC-String
<———————————-文件名:example305.cpp———————————————-> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 char name[16];//创建一字符数组,表示姓名 06 char school[50];//创建一字符数组,表示学校名 07 cout<<"请输入你的姓名:"<<endl; 08 cin. get(name,16);//使用cin提供的get函数读取一串字符 09 cin. get();//从输入流中读出换行符 10 cout<<"请输入你所在的学校名:"<<endl; 11 cin. getline(school,50);//使用getline函数读取一串字符 12 cout<<"你的名字是:"<<name<<endl; 13 cout<<"你所在的学校是:"<<school<<endl; 14 return 0; 15 }
输出结果如下所示。
请输入你的姓名: Nedved Pavel(注:键盘输入) 请输入你所在的学校名: Juventus Italy(注:键盘输入) 你的名字是:Nedved Pavel 你所在的学校是:Juventus Italy
【代码解析】代码第11行,在读入学校名时,用了这样的语句:“cin.getline(school,50);”,getline()函数有两个参数,一个是字符数组名,另一个是要读取的字符数,如果这个参数为50,那么函数最多读取49个字符,保留的一个空间用于存储自动在末尾添加的空字符'\0',在读取指定数目的字符(第2个参数减1)后,或者是遇到换行符时,getline()函数停止读取。
“cin. get(name,16);”与“cin.getline(school,50);”用法完全一致,两者唯一的区别在于对换行符(用户按回车键输入的字符)的处理。getline()在遇到换行符时,将换行符从输入队列中提取出来,抛弃掉,而get()函数不再提取并抛弃换行符,仍将其留在输入队列中。
所以,代码3.5中第9行语句“cin.get();”不可缺少,其用以从输入队列中提取一个字符,也就是把“cin.get(name,16);”遗留在输入队列中的换行符提取出来,否则,若没有“cin.get();”,在执行“cin.getline(school,50);”时,输入队列中的第一个字符就是换行符,因此,getline()函数会认为已经到达行尾,却没有任何可以读取的内容,所以school将会成为只有一个'\0'的空字符串。因此,在使用get()函数时,一定要采用如下调用序列。
cin.get(数组名,数组大小); cin.get()这与 cin.getline(数组名,数组大小);
是等价的。
注意
对get()函数而言,有一个更简洁的写法是“cin.get(数组名,数组大小).get();”。