前言
正文
思路
两种方法,推荐能够自行写出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;
}