单词倒排 C++
先整个字符串倒序,之后对每个单词倒序即可

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string s;
    while (getline(cin, s) && !s.empty()) {//读取一行字符
        for (int i = 0; i < s.size(); i++) {//非字母字符换成空格
            if (!((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')))
                s[i] = ' ';
        }
        int i = 0, j = 0;
        int n = s.size();
        while (s[n - 1] == ' ') n--;
        s.resize(n);//去掉字符串末尾多余空格
        reverse(s.begin(), s.end());//字符串倒序
        string res = "";
        while (j < n) {
            while (s[j] != ' ' && j < n) j++;//找到第一个空格的位置j,子串s[i,j)为一个倒序的单词
            reverse(s.begin() + i, s.begin() + j);//将子串s[i,j)倒序,变回正常单词
            if (j - i > 20)//if判断截取子串前20个字母或者直接截取整个子串
                res += s.substr(i, 20);
            else
                res += s.substr(i, j - i);
            res += ' ';//添加空格分隔单词
            while (s[j] == ' ' && j < n) j++;//找到下一个单词的首字母位置
            i = j;//将该首字母位置传给i作为下一次截取单词的起点
        }
        res.resize(res.size() - 1);//去掉截取最后一个单词时多添加的一个空格
        cout << res << endl;
    }
    system("pause");
    return 0;
}