C++中cin,cin.get,cin.getline()的区别

在C++中,一次输入过程是这样的,当从输入设备中输入数据后会先存储在输入流缓冲区中,在有相应的操作符从缓冲区中读取数据,由于在C++中有:cin,cin.get(),cin.getline()三种操作符,因此需要在不同情况使用不同的操作符。


一、cin

<span style="font-size:14px;">#include<iostream>
using namespace std;

int main()
{
	const int a = 20;
	char name[a];
	char dessert[a];

	cout << "Enter your name:\n";
	cin >> name;
	cout <<  "Enter your favorite dessert:\n";
	cin >> dessert;
	cout << "I have some delicious " << dessert;
	cout << " for you, " << name << endl;
	return 0;
}</span>
如果在第一次出入中输入Hello zero后会发现直接跳过“输出dessert”的过程,直接显示程序。

原因是cin使用空白(回车、空格和制表符)来确定字符串的位置,这意味着cin在获取字符数组时只能读取一段字符,读取完后自动在结尾添加空字符'\0'。

在这个例子中cin把Hello作为第一个字符串读入到name中,把zero放入输入流缓冲区中,当再次读取时,cin会先在缓冲区搜索,找到zero,把它放到delicious中。

要想读取一整行的输入就要用到cin.getline()和cin.get()。



二、cin.getline()

cin.getline()函数读取一整行数据并通过回车来作为结束符,不保存换行符。

该函数包含两个参数,形如cin.getline(string s,int n) ,在cin.getline(string s,int n)中,第一个参数string使用来存储输入行的数组的名称,而第二个参数int则是要读取的字符数,但要保留最后一位添加空字符'\0'。例如,如果第二个参数为20,那么函数最多只能读取19位,最后一位自动保留用来添加'\0'.


示例如下:

#include<iostream>
using namespace std;

int main()
{
	const int a = 20;
	char s1[a];
	char s2[a];
	cout << "Enter first line:\n";
	cin.getline(s1,a);
	cout << "Enter second line:\n";
	cin.getline(s2,a);
	cout << "Display it:\n";
	cout << s1 << endl ;
	cout << s2 << endl;
	return 0;
}
程序输出如下:

Enter first line:

hello zero

Enter second line:

hello world

Display it:

hello zero

hello world


三、cin.get()

cin.get有几种变体。其中一种为cin.get(string s,int a),与cin.getline()类似,接受参数的方式相同,含义也相同,都以换行符作为结尾,但是cin.get()并不丢弃换行符,而是将其保存在输入队列中。

#include<iostream>
using namespace std;

int main()
{
	const int a = 20;
	char s1[a];
	char s2[a];
	cout << "Enter first line:\n";
	cin.get(s1,a);
	cout << "Enter second line:\n";
	cin.get(s2,a);
	cout << "Display it:\n";
	cout << s1 << endl ;
	cout << s2 << endl;
	return 0;
}
当我们再次输入hello zero时会发现当要输入s2时会自动跳过并直接输入结果。

这是因为,由于第一次调用后,换行符保留在输入流缓存中,当再一次调用get()时,读取到的第一个字符是换行符,因此,get()认为已经到达行尾了。

要想跳过换行符进行下一次读取,需要用到cin.get()另一个变体,即无参数的cin.get(),无参数的cin.get()只读取一个字符,因此可以用它来处理换行符来读取下一行。可以采用如下方式:

cin.get(s1,a);

cin.get();

cin.get(s2,a);

cin.get();



有关cin的相关操作还有很多变体,以上三种是最常用的,相对来说比较简单的,想要深入了解的可以看看《C++ primer plus》

参考书籍:《C++ primer plus

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值