C++-基础语法-cin.getline() 与 cin.get() 的区别,以及getline()函数使用方法

参考声明:

《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<<line<<endl;
    return 0;
}

当然,也可以指定结束字符,比如指定'#'为结束字符,这时候敲击‘回车’键,输入不会终止:

int main()
{
	string line;
	cout << "please cin a line:"<<endl;
	getline(cin, line, '#');
	cout << endl << "The line you give is:" << line;
    return 0
}

运行结果:

由于指定的结束符为'#',所以在输入完第一行后,敲击回车键,程序并没有结束,而是继续等待输入,直到输入了'#';

通过打印的结果可以看出,换行符也被读入到输入流中,所以一次性输出了两行。

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

添加之后,输出正常:

猜你喜欢

转载自blog.csdn.net/qq_17753903/article/details/82258460
今日推荐