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