cin, cin.getline(), cin.get()你都搞懂了吗

1.前言

在C++中,可应用 cin, cin.getline(), cin.get() 它们都可以分别输入字符串。而他们也有各自的优缺点,在输入格式不同的要求下,我们又该怎么选择呢,接下来我们看看他们究竟是怎么输入字符串。

2.使用cin

我们先来看看程序实例1

#include<iostream>
using namespace std;
int main(){
	const int Size = 20;
	char address[Size];
	char name[Size];
	cout << "Please enter your address:\n";
	cin >> address;
	cout << "Please enter your name:\n";
	cin >> name;
	cout << "Yor address is: " << address << endl;
	cout << "Your name is: " << name;
	return 0; 
}

运行结果:

Please enter your address:
New York
Please enter your name:
Yor address is: New
Your name is: York

从运行结果我们可以看出,我们还没有对"Please enter your name:”做出反应,程序便把它显示出来了,这显然是错误的,不符合输入要求。
cin使用空格,制表符,换行符来确定字符串的结束位置,这也就意味着cin在获取字符数组时只读取一个单词。
这个例子结果是:cinNew作为第一个字符串,并把它放到address数组中。这把York留在输入队列中,当cin在输入队列中搜索name时,它发现了York,因此cin读取York,并将它放到name数组中。

3.使用getline()

从上一个例子我们可以看到cin的缺点,当程序要求输入地址名,用户输入New York。我们希望程序读取并存储完整的城市名,而不是New
也就是要将一行语句作为输入,而不是某个单词。而接下来要介绍的面向类的成员函数getline()正好具有面向行输入的功能。
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline )成员函数在读取指定数目的字符或遇到换行符时停止读取
例如,假设要使用getline将姓名读入到一个包含20个元素的name数组中。可以使用这样的函数调用:
cin.getline(name,20);
程序实例1:

#include<iostream>
using namespace std;
int main(){
	const int Size = 20;
	char address[Size];
	char name[Size];
	cout << "Please enter your address:\n";
	cin.getline(address,Size);
	cout << "Please enter your name:\n";
	cin.getline(name,Size);
	cout << "Yor address is: " << address << endl;
	cout << "Your name is: " << name;
	return 0; 
}

运行结果:

Please enter your address:
New York
Please enter your name:
Ailece
Yor address is: New York
Your name is: Ailece

从运行结果我们可以看出cin.getline()是将New York作为一个字符串真题进行输入。
注意:getlint()函数每次读取一行,它通过换行符来确定行尾,但不保存换行符。

4.使用get()

我们来试试另一种方法。istream类有另一个名为get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续两次调用get( ):
程序实例

#include<iostream>
using namespace std;
int main(){
	const int Size = 20;
	char address[Size];
	char name[Size];
	cout << "Please enter your address:\n";
	cin.get(address,Size);
	cout << "Please enter your name:\n";
	cin.get(name,Size);
	cout << "Yor address is: " << address << endl;
	cout << "Your name is: " << name;
	return 0; 
}

运行结果:

Please enter your address:
New York
Please enter your name:
Yor address is: New York
Your name is:

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾,而没有发现任该换行符。
幸运的是,使用不带任何参数的cin.get()可以读取下一个字符(即使是换行符)因此可以使用它来处理换行符,为下一行读取做好准备,例如:
程序实例:

#include<iostream>
using namespace std;
int main(){
	const int Size = 20;
	char address[Size];
	char name[Size];
	cout << "Please enter your address:\n";
	cin.get(address,Size);
	cin.get(); //吸收换行符
	cout << "Please enter your name:\n";
	cin.get(name,Size);
	cout << "Yor address is: " << address << endl;
	cout << "Your name is: " << name;
	return 0; 
}

运行结果:

Please enter your address:
New York
Please enter your name:
Alice
Yor address is: New York
Your name is: Alice

5总结:

如果有小伙伴这方面的知识掌握不是很好,记得多敲,多敲几遍就记住啦。如果觉得有帮助,还请支持一下博主啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值