包含头文件 #include <sstream>
初始化可以使用 clear()、 str( ) 赋值;
这里的clear方法,实际上是清空stringstream的状态(比如出错等),清空内容需要使用.str("")方法
直接调用str()方法可以返回 returns a string object with a copy of the current contents of the stream.
可以使用<<输入和>>输出
string s; stringstream ss; int a, b, c; getline(cin, s); ss.clear(); ss.str(s); ss >> a >> b >> c; //这里默认空格直接会分词,而且即使abc的类型不同还是可以的,相当于灵活类型转换
string s; stringstream ss; int n, i, sum, a; cin >> n; getline(cin, s); // 读取换行符 for (i=0; i<n; i++) { getline(cin, s); ss.clear(); ss.str(s); sum=0; while (1) { ss >> a; if ( ss.fail() ) break; //fail()判断是否到底 sum+=a; } cout << sum << endl; }
//stringstream用于split很方便 string a, b, c, d; string lines="adfa;asdfasd;fasdf;ccc"; stringstream line(lines); //可以直接初始化 getline(line, a, 'f'); getline(line, b, ';'); getline(line, c, ';'); getline(line, d); //与不同的getline搭配 cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; cout<<"d = "<<d<<endl;
还有个问题:这里默认的分词都是空格,那么如果是其他的比如逗号怎么做
可以用如下代码:
#include <iostream> #include <stdlib.h> #include <sstream> #include <cstring> //使用到c_str(),strtok函数 using namespace std; int main() { string my_string; while(getline(cin, my_string, ' ')) { char *pch; cout << my_string << endl; char str[128]; //c_str()返回的是一个临时指针,不能直接复制 strcpy(str, my_string.c_str()); //char* str; //str=const_cast<char*>(my_string.c_str()); 也可以直接使用char* c_str()返回的是常量的指针,所以作了const_cast转换 cout << str << endl; pch = strtok(str, " -,."); // 空格,'-',',','.'都是分隔符 ,其实也是把这个分隔符替换为空格 while(pch != NULL) { cout << pch << endl; pch = strtok(NULL, " -,."); // 注意这里是NULL } } return 0; }
函数strtok的格式:char* strtok (char* str,constchar* delimiters );
------------------------------------------------------------
华为机试1:
字符串最后一个单词的长度
#include <iostream> #include <cstring> #include <sstream> using namespace std; int main(){ string str,res; getline(cin,str); //只能使用getline函数来读入直到换行符 if(str.length()>5000) return 0; stringstream s; s.clear(); s.str(str); while(1){ s>>res; if(s.fail()) break; } cout<<res.length(); return 0; }
华为机试题2:简单错误记录
string getfilename(string file){ int pos; pos=file.rfind('\'); file=file.substr(pos+1,file.length()-pos); //使用rfind和substr函数获取 if(file.length()>16) file=file.substr(file.length()-16,16); //pos是从0开始的 return file; }
使用了string的rfind函数,find从前往后找,rfind从后往前,如果没找到会返回string::npos