包含頭文件 #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, '\n')) {
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

