getline 函数和标准输入流的cin.getline的用法和不同

1.getline()函数的定义:


istream& getline(istream& is,string & str, char delim = '/n')

其中 istream 是输入流,getline()函数从输入流中读取数据
str为字符串,存取从输入流中读取的数据
delim为分隔符,遇到分隔符时,将已读取到的数据存入str中,默认分隔符为'/n',也可以定义自己的分隔字符

例子:

#include "iostream"
using namespace std;
#include "string"
#include "sstream"
int main()
{
	string str;
	getline(cin,str,'*');

	cout << str << endl;

	system("pause");
	return 0;
}

程序运行后会要求我们输入:我们输入 1234*5678

程序输出结果为:

遇到我们设置的结束符时   读取结束将读取结果传给str

例子2:

getline()常用来分隔字符数据,比如我们由123/456/789,我们想要将这些字符按 '/' 分隔并进行输出

#include "iostream"
using namespace std;
#include "string"
#include "sstream"
int main()
{
	string str;
	while (getline(cin, str, '/'))
	{
		cout << str << " ";
	}
	cout << "已经跳出循环" << endl;
	system("pause");
	return 0;
}

输入  123/456/789 我们发现并不能如期输出我们想要的结果,输出为

而且没有跳出循环,而是等待cin继续输入;这是因为 getline()函数的返回值为 istream& ,在这里即为 cin ,所以 while 循环会 判断cin是否有效,而只有输入不结束,cin是持续有效的,只是没遇到 结束符 '/' ,没有读取到 str中罢了;所以 跳不出while循环,实际中也不能这么用,那么想要实现上述功能应该怎么做呢?

我们引入 stringstream, 将字符串转化为 输入流类,进而采用getline()函数进行分割

stringstream 类是 istream的子类,所以可以当做 getline()函数第一个参数的输入(因为子类是特殊的父类)

getline规则,会出现空字符,比如如果是以空格' '为分隔符,用 getline来分割 "   ad df", 字符ad前面有三个空格,用0来表示空格

则表示为"000ad0df"以0来分割,第一个0的左边为空字符,去除第一个0后第二个0左边为空字符,去除第二个0后第三个0左边为空字符,去除第三个0后第4个0左边为ad字符,第4个0右边为df字符;所以 共分出5个字符,前三个空字符和 ad , df两个字符

如下:

#include "iostream"
using namespace std;
#include "string"
#include "sstream"
int main()
{
	string str;
	string tmp;
	cin >> tmp;
	stringstream ss(tmp);//用字符串类初始化输入输出流

	while (getline(ss, str, '/'))
	{
		cout << str << " ";
	}
	cout << "已经跳出循环" << endl;
	system("pause");
	return 0;
}

扩展:

stringstream类还常常用来做类型转换

如:

将字符串"12345"转为整型12345

#include "iostream"
using namespace std;
#include "string"
#include "sstream"
int main()
{
	int a;
	string s1 = "123456";
	stringstream ss(s1);
	ss >> a;
	cout << a << endl;
	system("pause");
	return 0;
}

输出结果为 123456

注:1.如果在转化过程中需要用到同一个 stringstream 对象,则在再次使用时需要进行 claer()操作,

              clear()这个名字让很多人想当然地认为它会清除流的内容, 实际上它并不清空任何内容,它只是重置了流的状态标志。

      2.stringstream 的 str() 将stringstream流中的内容拷贝一份字符串格式的内容

2.cin.getline()函数

cin.getline(char* str,int N,char delim);
从标准输入流中读取数据,如果没有遇到读取结束标志符,默认结束符为'/n'
则在读取到N-1个字符时停止读取,因为最后一个字符为'/0';如果遇到则读取结束。将读取到的内容存入 C型字符串中

例子:

#include "iostream"
using namespace std;
int main()
{
	char tmp[80];
	cin.getline(tmp,6,'/0');
	cout << tmp;
	system("pause");
	return 0;
}

输入:12345678

输出为:12345 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值