前言

传送门

正文

思路

两种方法,推荐能够自行写出split函数的模板

1)find函数

函数原型:size_t find(const string& str, size_t pos = 0) const;

功能说明:从pos位置开始查找子字符串str第一次出现的位置

参数说明:str为要查找的子字符串,pos从为初始查找位置

返回值:找到的话返回子字符串第一次出现的位置,否则返回string::npos

2)substr函数

函数原型:string substr(size_t pos = 0, size_t n = npos) const;

功能说明:获取从指定的起始位置开始,长度为n的子字符串

参数说明:pos为起始位置,n获取的1字符串长度

返回值:子字符串

参考题解一

#include<iostream>
#include<cstdio>
#include<string> 
using namespace std;
/*
因为PAT是单点测试,故出现下面这种简单的解法,这里需要注意的是在控制台黑框
中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要按<Ctrl+Z>
组合键再按<Enter>键的方式来告诉系统已经到了EOF,这样系统才会结束while
*/
int main(){
	string str,res[80];
	int num=0;
	while(cin>>str){
		res[num++]=str;
	}
	for(int i=num-1;i>=0;i--){
		cout<<res[i];
		if(i!=0)cout<<" ";
	}
	cout<<endl;
} 

参考题解二

#include<iostream>
#include<vector> 
#include<string> 
using namespace std;
/*
很容易想到使用空格分割字符串存放至数组中,
然后再逆序输出该数组内容即可,不过问题在于
C/C++中没有split函数可以直接对字符串进行分割,
因此我们需要自己实现一个split函数,可以利用
STL库中string的find函数和substr函数来实现。
除此之外,因为scanf和cin在读取字符串时,空格和
换行都会停止字符串的读入,所以需要使用string头文件
中的getline(cin,str)函数来读入一行数据 。
*/
vector<string> split(const string& str,const string& delim){
	vector<string> res;
	string ss=str+delim;//扩展字符串,方便检索出最后一个分割出的字符串 
	int pos;
	int len=ss.size();
	for(int i=0;i<len;i++){
		pos=ss.find(delim,i);//pos为分割符第一次出现的位置,从i到pos之间的字符串就是分割出来的字符串 
		if(pos!=string::npos){//找到了分隔符的位置 
			string temp=ss.substr(i,pos-i);//获取从i开始,长度为pos-i的子字符串
			res.push_back(temp);
			i=pos+delim.size()-1;//更新i 
		} 
	} 
	return res;	
}
int main(){
	string str;
	int num=0;
	getline(cin,str);
	vector<string> res=split(str," ");
	for(int i=res.size()-1;i>=0;i--){
		cout<<res[i];
		if(i!=0)cout<<" ";
	}
	cout<<endl;
}