getline()、cin.get()和cin.getline()的使用方法

一:getline()

#include <iostream>
#include <string>
int main ()
{
  std::string name;
  std::cout << "Please, enter your full name: ";
  std::getline (std::cin,name);
  std::cout << "Hello, " << name << "!\n";
  return 0;

getline()的原型:

istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);

getline返回cin,cin再转换为bool值(读入成功),或者false值(读入失败)。
1、istream &is表示一个输入流,比如说cin。
2、string &str 表示把从输入流读入的字符串放到str中。
3、char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是遇到回车停止读入。
举个例子:

#include <iostream>
#include <string>
int main()
{
	std::string name;
	std::cout << "Please, enter your full name: ";
	std::getline(std::cin, name, '#');
	std::cout << "Hello, " << name << "!\n";
	return 0;
}

结果:
在这里插入图片描述
getline()返回的是输入流,所以下面的代码while()判断是判断输入流是否有效,因此会形成一个死循环,当输入非空时,输入流有效;当直接输入回车时,只会中止getline()函数的读入操作,但是输入流依然是有效的,满足条件。

#include <iostream>
#include <string>
int main()
{
	string str;
	while (getline(cin, str))
		cout << str << endl;
	return 0;
}

二:cin.getline()
这个函数会一次读取包括空白字符的多个字符,以指定地址作为第一个字符的存放位置,然后依次往后存放读取的字符,一直到读满N-1个或者遇到指定的结束符为止,此函数不保留结束符。如果不指定结束符的话,默认'\n'为结束符。
用cin.getline()读入一行数据时,如果输入数据大于函数参数中的字符个数时,返回0,小于等于时返回1,注意返回值需要转换为bool类型。

cin.getline(char* ch, int N, char delim)

举个例子:

#include <iostream>
using namespace std;
int main()
{
	char m[20];
	cin.getline(m, 5);//读入4个字符,第5个位置置为'\0'
	cout << m << endl;
	return 0;
}

输入:123456789
输出:1234

cin.getline()属于cin(istream类)的成员函数,getline()在头文件string中,是普通函数,是不一样的两个函数。
需要注意的是:如果在cin.getline()或者getline()前面有cin的话,程序会将之前输入的字符作为输入,所以我们需要将之前的输入先读取完或者刷新一下输入缓冲区之后再读取新的输入,代码如下所示:

#include <iostream>
#include <string>
int main()
{
	std::string name;
	int age;
	cin >> age;
	std::cout << "Please, enter your full name: ";
	std::getline(std::cin, name);//先把上次输入的内容读完
	std::getline(std::cin, name);//新的内容覆盖原来的内容
	std::cout << "Hello, " << name << "!\n";
	return 0;
}
#include <iostream>
using namespace std;
int main()
{
	char m[20];
	int age;
	cin >> age;
	cout << "please: ";
	fflush(stdin);//刷新一下输入缓存区
	cin.getline(m, 5);
	cout << m << endl;
	return 0;
}

cin>>流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。并且,cin不会主动删除输入流内的换行符,会把换行符留在输入流中,接下来,getline()等函数第一个读入的就是cin>>语句未处理的换行符,导致getline()等函数直接结束。

三、cin.get()
cin.getline()和cin.get()的工作方式类似,接收参数相同,两者都有两个参数,第一个参数是用来存储输入行的数组名称,第二个参数是要读的字符数。由于最后一位用来添加空字符。所以,如果第二个参数为20,那么这个函数最多存储19个字符。
但是cin.get()会将换行符留在队列中,所以不能连续两次调用cin.get()。在第一次调用后,换行符将留在输入队列中,在第二次调用时,cin.get()读取的第一个字符将是换行符,所以cin.get()认为读取到行尾,从而未发现任何可读取内容。
我们可以使用不带任何参数的cin.get(),读取下一个字符。即,使用cin.get()跳过这个换行符,使得下一次cin.get()能够从换行符之后开始读取。或者使用fflush(stdin);将输入缓存区刷新一下再进行下一次get()。
cin.get(name,size)返回的是一个cin对象,该对象又可以被接着用来调用cin.get()函数。所以可以像cin.get(name,size).get();这样拼接使用,即在一行内实现连个函数。另外,同样的原理,cin.getline()也可以同时读取两行:cin.getline(name1,size).getline(name2,size);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值