参考声明:
《C++ primer plus 》
https://blog.csdn.net/best_fiends_zxh/article/details/53064771
https://blog.csdn.net/u011421608/article/details/44591579
1.cin.getline() 与 cin.get()
相同点:
工作方式类似;接收参数相同;解释参数方式相同;都读取到行尾;
两者都有两个参数,第一个参数是用来存储输入行的数组名称,第二个参数是要读的字符数;
注意:由于最后一位用来添加空字符。所以,如果第二个参数为20,那么这个函数最多存储19个字符。
不同点:
cin.get()并不读取并丢弃换行符,而是将其留在队列中。所以不能连续两次调用cin.get()。
cin.get(name,ArSize);
cin.get(dessert,Arsize); // a problem
由于第一次调用后,换行符将留在输入队列中.
因此第二次调用是,get()读取的第一个字符将是换行符,此时,get()认为读取到行尾,而未发现认可读取内容。
解决方案:
使用不带任何参数的变体cin.get(),读取下一个字符。即,使用cin.get()跳过这个换行符,使得下一次cin.get()能够从换行符之后开始读取。
cin.get(name,ArSize); //read first line
cin.get(); //read newline
cin.get(dessert,Arsize); //read second line
拼接用法:
cin.get(name,ArSize)和cin.get()可以拼接使用,即,在一行内实现连个函数:
cin.get(name,ArSize).get();
可以这样做的依据是:
cin.get(name,ArSize)返回的是一个cin对象,改对象又可以被接着用来调用cin.get()函数。
另外,同样的原理,cin.getline()也可以同时读取两行:
cin.getline(name1,ArSize).getline(name2,Arsize);
把连续的两行分别读入到了name1,name2中,这和调用两次cin.getliine()效果是相同的。
2.getline()函数
除了cin.getline()函数外,C++还有一个getline()函数。
getline()的原型是istream& getline ( istream &is , string &str , char delim );
其中 istream &is 表示一个输入流,譬如cin;
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。
int main()
{
string line:
while(getline(cin,line))
cout<
当然,也可以指定结束字符,比如指定'#'为结束字符,这时候敲击‘回车’键,输入不会终止:
int main()
{
string line;
cout << "please cin a line:"<
运行结果:
由于指定的结束符为'#',所以在输入完第一行后,敲击回车键,程序并没有结束,而是继续等待输入,直到输入了'#';
通过打印的结果可以看出,换行符也被读入到输入流中,所以一次性输出了两行。
3.getline()函数与cin 混用
getline()和cin混用的时候,需要额外注意:
int main()
{
int age;
string name;
cout << "请输入年龄:" << endl;
cin >> age;
cout << "请输入姓名:" << endl;
getline(cin, name);
cout << "年龄:" << age << endl;
cout << "姓名:" << name << endl;
}
输出结果为:
输入完年龄:01之后,程序就结束了,并且姓名为空。为什么程序没有等待我们输入姓名呢?
这与cin>>与getline的工作方式有关:
cin>>:流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。并且,cin不会主动删除输入流内的换行符。
getline函数:从istream中读取一行数据,当遇到“\n”时结束返回。
因此,程序执行过程是这样的:
在cin>>age语句获取了年龄之后,把换行符留在了输入流之中;
接下来,getline()函数第一个读入的就是cin>>语句未处理的换行符,导致getline()直接结束。
解决方法:在cin>>语句之后,添加cin.ignore()语句,对换行符进行处理即可。
cin.ignore()语句用法,可参考:https://blog.csdn.net/wxbmelisky/article/details/48596881
添加之后,输出正常: