初学者 pat basic 练习九 说反话

题目:

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

思路:

首先用一个字符串接受输入(当然是要接收空格的),然后根据空格分割字符串,分割后的子串存到vector容器中,然后在倒序输出就好了

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    string s;
    vector<string> str;
    string::size_type pos;//接受索引
    getline(cin,s);//可接收带空格的字符串
    for(int i=0;i<s.length();i++)
    {
        pos=s.find(" ",i);//找到空格的索引
        if(pos!=s.npos)
        {
            str.push_back(s.substr(i,pos-i));//将空格前的子串放进容器
        }
        else//如果没找到空格,说明当前位置是最后一个单词了
        {
            str.push_back(s.substr(i));//将当前索引到最后索引所有字符串放进容器
            break;//因为是最后一个单词了,所以要跳出循环,不然的话随着i++,会把剩下的字母都放进去就错误了
        }
        i=pos;//重新定位索引的位置
    }
    reverse(str.begin(),str.end());//翻转容器
    for(vector<string>::iterator it=str.begin();it!=str.end();it++)
    {
        cout<<*it;
        if(it!=str.end()-1)
            cout<<" ";
    }
    return 0;
}

另:我这个写法分割时要判断pos找没找到,因为结尾不是空格,所以pos违法无法指向结尾

需要if else,麻烦。其实可以再输入字符串之后在结尾加一个空格,这样pos就可以指向最后一个单词后面,就方便分割了

部分代码:

getline(cin,s);
s+=" ";
for(int i=0;i<s.length();i++)
{
    pos=s.find(" ",i);
    str.push_back(s.substr(i,pos-i));
    i=pos;
}

心得:

当需要得到带空格的字符串是,用getline(cin,str),str是字符串变量名

需要存string.find()返回值时,用string::size_type类型来存

string.find(ch,pos)两个参数,ch表示要查找的字符,pos是开始查找的索引(不写就是从头开始),返回第一次找到的索引

string.substr(pos,len)两个参数,pos表示开始的索引(不写从0开始),len表示子串长度(不写一直结尾),返回一个子串

附:做完这个题一天后,才发stringstream也可以分割字符串,因为stringstream>>str时,遇到空格就停止输入到str

也可以这样:

 string s,temp;
    vector<string> str;
    stringstream ss;
    getline(cin,s);
    ss<<s;
    while(ss>>temp)
        str.push_back(temp);
//这样就把分割后的字符串装进容器中了
发布了24 篇原创文章 · 获赞 3 · 访问量 818

猜你喜欢

转载自blog.csdn.net/qq_40930559/article/details/104077801