题目描述:
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入描述:输入一行以空格来分隔的句子(当时我没看这个输入描述,我以为非字母以外的字符全是分隔符,并且AC代码也是按照这种想法进行处理的)
I am a student
输出描述:输出句子的逆序
student a am I
做题思路:
将出现的所有非字母函数都当做分隔符进行处理。
1. 确定整个字符串有多少种分隔符
2. 按照这些分隔符对字符串进行分割,分割方法使用strtok函数,对于多种分隔符也可以完成分割任务
3. 将分割得到的子串倒序输出即可
注意事项:
1. 本题输出单词,最后一个单词后面不能有空格
2. 关于string的一些函数
string s;
k = s.find(t);
返回值是子串(t必须是一个字符串)在母串中的位置(int)
如果没有找到,那么会返回一个特别的标记npos, 即 k == s.npos 代表没有找到
char c;
s.push_back(c); 可以将c插入到s的尾部
s.c_str() 将string类型转换为const char*类型
注意:不能用char*类型接受,const char*不能完成到char*的转换
AC代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
bool isFind(string s,char c); //判断字符c是否在s中存在
string getSplitc(char *str); //获取有哪些分隔符
int main()
{
char str[1500];
while( gets(str) ){
string split = getSplitc(str);
vector<char*> word;
const char *s = split.c_str();
char *t = strtok(str,s);
while( t!=NULL ){
word.push_back(t);
t = strtok(NULL,s);
}
for(int i=word.size()-1; i>0; i--){
cout<<word[i]<<" ";
}
cout<<word[0]<<endl; //注意 输出最后一个单词的后面不能加空格
}
}
bool isFind(string s,char c)
{
for(int i=0; i<s.size(); i++){
if( s[i]==c ){
return true;
}
}
return false;
}
string getSplitc(char *str)
{
string s;
for(int i=0; i<strlen(str); i++){
if( !isalpha(str[i]) ){ //如果当前字符不是分隔符
if( !isFind(s,str[i]) ){ //如果这个分隔符之前没有被添加
s.push_back(str[i]);
}
}
}
return s;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)