7-49 说反话-加强版 (20分)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come

输出样例:
Come I Here World Hello

如题,既然是按空格分割的,就用stingstream流实现转换,因为stringstream是以空格分隔字符串的。

#include <iostream>
#include <vector>
#include <sstream>
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((ll)x.size())
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define REP(i,n) for(int i=0;i<(n);++i)
#define mem(a,b) memset(a,(b),sizeof(a));
const int maxn = 1e5+10;
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll,ll> pii;
template<class T>
inline void read(T &x){
 x=0;
 int f=0;
 char c=getchar();
 while(!isdigit(c)){
  f|=(c=='-');
  c=getchar();
 }
 while(isdigit(c)){
  x=(x<<3)+(x<<1)+c-'0';
  c=getchar();
 }
 if(f) x=-x;
}
ll ksm(ll a,ll b,ll mod){
 ll ans=1;
 while(b){
  if(b&1) ans=ans*a%mod;
  a=a*a%mod;
  b>>=1;
 }
 return ans;
}
ll gcd(ll a,ll b){
 return b==0?a:gcd(b,a%b);
}
string s;
int k;
vector<string> q;
int main(){
 getline(cin,s);
 string c;
 stringstream str(s);
 while(str>>c) q.push_back(c);
 for(int i=q.size()-1;i>=0;i--){
  if(i!=q.size()-1) cout << " ";
  cout << q[i];
 }
 return 0;
}

那么就复习一下stringstream的用法。

int main()
{
 //实现类型转换。 
 string s="123456";
 stringstream ss(s);//构造一个流。 
 //或者stringstream ss, ss.str(s);
 int t=0;
 //ss<<s;(将s输入流)
 ss>>t;//(输出到t中)
 
 ss.str("");//清空ss. 
 
 //stringstream st
 //st.put('d') 插入数据。 
 
 cout << t; 
}

然后我惊奇的发现,sscanf和sprint的用法也忘了。。。。。

函数用法:int sscanf( const char *buffer, const char *format, [ argument ] ... );

一些基本用法:

int main()
{
 char s1[512];
 char s2[512];
 int rt;
 char t[]= "UESTC EE 4200802";
 sscanf(t,"%s %s %d",s1,s2,/*注意存放的是地址*/&rt);
 //最左边存放已知的字符串,后面则为需要转换的格式。 
 cout << s1 <<  " " << s2 << " " << rt << endl;
 
 cout<<"======================================"<<endl;
 //取指定长度的字符串。
 
 char *s="12345678";
 sscanf(s,"%5s",s1);
 cout << s1 << endl; 
 
 //取指定字符为止的字符串
 s="123 abc";
 sscanf(s,"%[^ ]",s1);
 //%[^A-Z] %[^a-z] 等等。 
 cout << s1;
}

sprint就相对简单一点,

C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。

//把整数123 打印成一个字符串保存在s 中。

sprintf(s, “%d”, 123); //产生"123"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值