1009 说反话 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

思路

1.逆序输出
2.以空格分割单词
3.双下标确保输出单词

提示

1.多空格情况。
2.单个单词情况
3.string以空格为标志返回
4.string无法直接字符接收
5.注意具体长度

#include <iostream>
using namespace std;
#include <string>


int main() {
string str;
getline(cin, str);
int fn = 0, spcN = 0, pN = 0;
//同步i 目前的位置,空格,判断是否只有一个单词。
int index = str.length() - 1;

for (int i = str.length(); i > 0; i--)
{
fn = i;
//以空格为标志划分单词,不输出空格,手动输出空格。
//如果不是第一次碰见空格 就输出空格
if (str[i] == ' ') {
if (spcN)
cout << " ";
spcN++;
//标记现在上个空格到的位置
//输出非空格字符 防止多空格
for (int j = i + 1; j <= index; j++) {
if (str[j] != ' ')
{
cout << str[j];
pN++;
}
//到了上次的最后一位,开始新一轮同步位次
if (j == index) {
index = fn - 1;
}
}
}
}

//如果非单个单词 就输出空格
if (pN) cout << " ";

//最后一个单词逆序不会有空格 所以这里正序输出
//在第一个空格前break
for (int i = 0; i < str.length(); i++)
if (str[i] != ' ')
cout << str[i];
else break;

return 0;
}

其他有趣的写法 不是我写的

2.

列表 分割 反序 插入空格 输出

s=input().split()
s.reverse()
print(' '.join(i for i in s))

3.

1.以空格标识
2.更换为结束符 保证一次只输出一个词
3.首地址输出 直接输出完了 😂

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
char a[80];
gets_s(a,80);
int i = 0;
for (i = strlen(a); i > 0; i--)
{
if (a[i] == ' ')
{
printf("%s ", &a[i + 1]); //输出空格后的单词
a[i] = '\0'; //使后续输出仍为一个单词
}
}
printf("%s", &a[i]); //输出原字符串的第一个单词
return 0;
}