#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;
} 
京公网安备 11010502036488号