给定一堆用空格隔开的英文单词,输出这些英文单词的倒序(单词内部保持原序)。
eg:Hao Hao Xue Xi
输出为:Hao Hao Xue Xi
粗暴的思路就是利用空格,然后收集每一个单词,然后做一个倒序输出。
代码如下:
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
string n;
getline(cin,n);
vector<string> rev;
string temp = "";
for(int i=0;i<n.length();i++){
if(n[i]!=' '){
temp+=n[i];
}
else{
rev.push_back(temp);
temp.clear();
}
}
rev.push_back(temp);
temp.clear();//最后一个单词
reverse(rev.begin(),rev.end());
for(auto it = rev.begin();it!=rev.end();it++){
if(it!=rev.begin()){
cout<<" "<<*it;
}
else cout<<*it;
}
cout<<endl;
return 0;
}
而后看解析,发现了个更聪明的方法。
我们在输入如果单纯使用cin或者scanf,那么是无法读取空格的,而要采用getline或者cin.getline来读取一行。
而本题中,我们正是要利用这个空格来间隔开单词,那么用scanf就有意料之外的好处了,直接可以分割单词,然后逆序输出即可。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(){
char str[500][11];
int i = 0;
while(cin>>str[i]){
i++;
}
for(i--;i>=0;i--){
if(i!=0){
cout<<str[i]<<" ";
}
else{
cout<<str[i]<<endl;
}
}
return 0;
}
注意在dev C++中和VS Code中,这个换行符对EOF无效,要ctrl+z三次才能结束,但在判题系统上会是正确实现的。