发现sstream对于一些带有空格的字符串题目,处理起来很方便,因为sstream会把字符串用空格隔开 例如: str=“a b c d”;那么放入sstream(str)之后 现在sstream里面是这样的"a",“b”,“c”,d" 空格被去掉然后各个隔开来了。
**
看一下一道题的简单应用
**
7-5 说反话-加强版 (20分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
**
之前用判断的方法做起来的代码是这样的,pta提交有一个格式错误
**
#include<iostream>
using namespace std;
int main(){
string s;
getline(cin,s);
int len = s.length();
int cnt = 0;
int flag = 0;
for(int i = len-1; i >= 0; i--){
cnt++;
if(s[i]==' '&&!flag){
int j = i;
while(cnt>1){
if(s[j+1]==' ')break;
cout<<s[j+1];
j++;
cnt--;
}
cnt = 0;
flag = 1;
}
if(flag&&s[i]!=' '){
cout<<" ";
flag = 0;
}
}
for(int i = 0; i < len; i++){
if(s[i]==' '){
cout<<endl;
break;
}
cout<<s[i];
}
return 0;
}
**
用了sstream可以改写成这样,没有提交过,在控制台样例输出一样,需要注意的是string的最后一个是’/0’什么都不输出但是也算一个 被sstream截取,所以倒序输出跳到cnt-2
**
#include<iostream>
#include<sstream>
using namespace std;
int main(){
string str,s[100];
getline(cin,str);
stringstream sstream(str);
int cnt = 0;
while(sstream){
string substr;
sstream>>substr;
s[cnt++] = substr;
}
int flag = 0;
for(int i = cnt-2; i >= 0; i--){//string最后一个是'/0'空,虽然什么都不输出,但它也算一个,所以 跳到第二个
if(flag)cout<<" "<<s[i];
else {
cout<<s[i];
flag = 1;
}
}
return 0;
}