定义一个串流类对象,可在头文件中加#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; }