#include<iostream>//给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
#include<string>//在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
using namespace std;//思路运用string类灵活的函数
int main()
{
    string s;
    while (getline(cin,s))//getline得到输入的字符串,可以有空格
    {
        string s2;
        int k;
        while (s.find(' ',0) != string::npos)//从s的0位开始查找空格字符,没有的话返回值为string::pos
        {
            k = s.find(' ', 0);//find函数的返回值是空格字符在s中的位置
            string s1 = s.substr(0, k);//sub.str函数,从s的0位开始,复制k个字符到s1中;这里查找到空格位置为K,则表示前面的单词有k个字符组成,因为空格位置K是从0开始数的
            s2.insert(0, s1);//string 没有前插函数,用insert在0位之前插入字符串s1,此时s1为空格前的单词
            s2.insert(0, " ");//在单词前插入空格
            s = s.substr(k+1, s.length() - k-1);  //从空格字符后的第一个字符开始到最后一个字符复制给s,这样就可以进行新的下一轮循环
        }
        s2.insert(0, s);//退出条件是最后一个string s中找不到空格,则把最后一个单词即s插入到s2的头部,这样就完成了单词的逆序
        cout << s2 << endl;//输出s2;
    }
    return 0;
}
输入:
hello world here i come
输出:
come i here world hello
增加个递归的思路,但是输出格式调整比较麻烦,仅供思路参考
#include<iostream>
#include<cstring>
using namespace std;
void output(char* p)
{
	char* q =strchr(p,' ');
	if (q == NULL)
		cout << p<<' ';
	else
	{
		output(q + 1);
		*q = '\0';
		cout << p << ' ';
	}

}
int main()
{
	char str[80];
	while(gets_s(str))
	{
		output(str);
	}
	
	return 0;
}

还有个朴实的方法,更推荐这种,比较基础,从尾开始遍历,找到空格位置,则从空格后面开始输出单词,然后继续下一次查找
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	while (getline(cin, s))
	{
		int len = s.length();
		int p = len, k;
		for (int i = len - 1; i >= 0; i--)
		{
			if (s[i] == ' ')
			{
				for ( k = i + 1; k < p; k++)
					cout << s[k];
				cout << ' ';
				p = i;//保存空格的位置
			}
		}
		for (int i = 0; i < p; i++)//最后一次是找不到空格的,输出这个单词
			cout << s[i];
	}
	return 0;
}