✅ PAT 乙级题目讲解:1009《说反话》


📌 摘要: 本文讲解 PAT 乙级 1009 题《说反话》的解题方法。题目要求将输入英文句子的单词顺序逆序输出,而非字符反转。核心思路是利用 cin >> 自动按空格分词的特性,逐词读入字符串数组后从后往前输出,注意控制单词间空格、避免末尾多余空格。文中提供了完整 C++ 代码、常见错误提醒及思维拓展方向,适合 C++ 初学者练习字符串输入处理数组逆序遍历

🧩 题目简介

本题要求对输入的一句英文句子进行单词反转输出。所谓“说反话”,不是反转字符顺序,而是将句子中各个单词的顺序进行逆序输出。

输入保证:

  • 一行内的字符串长度不超过 80;
  • 各单词之间仅用一个空格分隔;
  • 不含多余空格。

🧪 样例分析

输入:

Hello World Here I Come

分析过程:

  • 原始顺序:Hello → World → Here → I → Come
  • 反转顺序:Come → I → Here → World → Hello

因此输出为:

Come I Here World Hello

🔍 解题思路

📎 变量说明

变量名含义
s[i]i 个单词,存入字符串数组中
k当前已经读入的单词数量,s[0] ~ s[k-1] 为有效内容

✅ Step 1:逐词读取输入句子

使用 while(cin >> s[k]) 逐个读取单词,并存入字符串数组 s[] 中,同时将 k++ 以便下次读入。

注意事项:

  • 第一个单词存入 s[0],第二个单词存入 s[1],……
  • 由于 cin >> 读取单词时遇到空格自动分隔,因此不需手动分割;
  • 循环结束时 k 表示读入单词的个数;
  • 有效单词范围为 s[0] ~ s[k-1]
while(cin >> s[k]){
    k++;
}

✅ Step 2:逆序输出单词

s[k-1] 开始逆序输出至 s[0],中间以空格连接。

注意:

  • 最后一个单词(即原句第一个单词)后不应有空格;
  • 所以仅当 i > 0 时输出空格。
for(int i = k - 1; i >= 0; i--){
    cout << s[i] << (i > 0 ? " " : "");
}

✅ 完整代码

#include <bits/stdc++.h>
using namespace std;

string s[100];
int k;
int main(){
    while(cin >> s[k]){
        k++; // s[0] ~ s[k-1]
    }
    for(int i = k - 1; i >= 0; i--){
        cout << s[i] << (i > 0 ? " " : "");
    }
    return 0;
}

🚧 常见错误提醒

错误类型具体表现
忘记输出空格所有单词之间要加空格,除了最后一个
输出多余空格最后一个单词后不能输出空格,应特判 i > 0
理解错下标范围实际读入的单词为 s[0] ~ s[k-1],不是到 s[k]

✅ 总结归纳

  • cin >> s[k] 可自动按空格分词;
  • 记录单词数量 k 后,逆序输出;
  • 注意边界条件与空格输出逻辑;
  • 本题为基础输入处理与字符串数组操作,适合作为输入输出训练的入门题。

🧠 思维拓展

  • 如果输入句子包含标点符号,是否能正确处理?
  • 如果输入中有多余空格,如何预处理?
  • 本题也可用 stack 来完成逆序输出 —— 将每个单词入栈,最后依次弹出。

更多推荐