#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; }