定义一个串流类对象,可在头文件中加#include<sstream>,istringstream对象iss可以将字符串中的数据进行分离。其中有一部分转自:http://www.cppblog.com/tommyyan/articles/8023.html
其中:istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
一、istringstream类:它是由一个string对象构造而来,可以从一个string中读取字符。它的函数原型是:istringstream::istringstream(string str);
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
void converFromString(const string &s)
{ istringstream iss(s);
double x;
while(iss>>x) cout<<x<<endl;
}
int main()
{ string s="1 15.6";
converFromString(s);
return 0;
}
二、ostringstream类是由一个string对象构造而来,它的函数模型是:ostringstream::ostringstream(string str);下面这个代码就直接拷过来了~一个是对作者的尊重,另一个我觉得他比我写的好多了~~呵呵~
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{ ostringstream ostr;
//ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr;
return 0;
}
/*在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。*/
三、stringstream类:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{ stringstream ostr("ccc");
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;
char a;
ostr>>a;
cout<<a;
return 0;
}
除此之外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{ stringstream sstr;
//--------int转string-----------
int a=100;
string str;
sstr<<a;
sstr>>str;
cout<<str<<endl;
//--------string转char[]--------
sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
string name = "colinguan";
char cname[200];
sstr<<name;
sstr>>cname;
cout<<cname;
return 0;
}
例题1:不指定个数求和
样例输入:
2
20 1 8 4 13 6 10 15 2 17 3 19 7 3 19 7 16 8 11 14 9 12 5
1 -2
样例输出:
Case 1: 20, 200
Case 2: 2, -1
代码:
#include<iostream>
#include<string>
#include<sstream>//字符串流
using namespace std;
string s;
int main()
{ long sum;
int i=1,n,m,x;
cin>>n;
cin.get();
while(getline(cin,s))
{ //istringstream iss(s);//定义一个字符串流对象,可以对字符串s中的数进行数据分离。
istringstream cin(s);//这个前面的iss可以自己随意定义。
sum=0;m=0;
while(cin>>x)//从串流类中读取数据
{ sum+=x;
m++;
}
cout<<"Case "<<i++<<": "<<m<<", "<<sum<<endl;
}
return 0;
}
例题2:NYOJ 525(一道水题),题目已经说了一道水题,用串流类来做的话更显简便,代码:
#include<iostream>
#include<cstring>
#include<sstream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX=5010;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
int x,sum,value[MAX];
string s;
int main()
{ while(cin>>s)
{ CLR(value,0);
sum=0;
for(int i=0;i<s.length();i++)
if(s[i]=='5') s[i]=' ';
istringstream cin(s);
while(cin>>x) value[sum++]=x;
sort(value,value+sum);
for(int i=0;i<sum-1;i++)
cout<<value[i]<<" ";
cout<<value[sum-1]<<endl;
}
return 0;
}