最稳妥方法是用 std::istringstream 按空白切分单词后逆序拼接,自动跳过多余空格并处理制表符、换行符等,输出仅含单空格分隔,且能正确处理空输入。

用 std::istringstream 拆单词再倒序拼接最稳妥
直接操作 std::string 的字符容易误翻转单个单词内部(比如把 "hello world" 变成 "dlrow olleh"),而题目要的是“各单词反序”——即单词顺序颠倒,但每个单词本身不变。所以必须先按空格切分,再逆向组合。
用 std::istringstream 是最轻量、不依赖额外库、且能自动跳过多余空格的方式:
std::string s = " hello world test ";
std::vector<std::string> words;
std::istringstream iss(s);
std::string word;
while (iss >> word) { // 自动跳过前后及中间的连续空格
words.push_back(word);
}
std::reverse(words.begin(), words.end());
std::string result;
for (size_t i = 0; i < words.size(); ++i) {
if (i > 0) result += " ";
result += words[i];
}
// result == "test world hello"
遇到制表符、换行符等空白字符怎么办
std::istringstream 默认以所有 std::isspace 为分隔符,包括 '\t'、'\n'、'\r' 和空格,无需额外处理。但如果业务要求“只认空格”,就得手动解析:
- 改用
std::string::find_first_not_of(" \t\n\r")+find_first_of(" \t\n\r")手动找词边界 - 或用
std::regex_token_iterator(C++11 起),但开销大,仅当格式极不规则时考虑 - 注意:
std::cin >> std::string同样跳过所有空白,但不能用于已有字符串的重解析
原地反转避免内存分配?别硬刚
有人想用双指针先整体翻转、再逐单词翻转来“原地”实现(类似 LeetCode 那道题),但那解决的是“单词内字母也翻转”的需求。本题只要求单词顺序反,不是字符级翻转。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
强行原地会引入大量边界判断和空格压缩逻辑,易出错且可读性差。现代 C++ 中 std::vector<:string></:string> + std::reverse 清晰、安全、性能足够好。除非你在嵌入式环境且字符串超长、内存极度受限,否则没必要绕路。
输入含前导/尾随空格时输出是否保留
题目说“按各单词进行反序重组输出”,隐含语义是“只保留单词间单空格”,即标准化输出。上面 std::istringstream 方案天然满足这点——它丢弃所有多余空白,拼接时只加一个空格。
如果明确要求保留原始空格结构(比如“hello␣␣world” → “world␣␣hello”),那就得用 std::string::find 系列手动提取非空格子串,并记录分隔符位置,复杂度陡增。这种情况极少,务必先确认需求。
真正容易被忽略的是:空字符串或全空白字符串输入时,while (iss >> word) 循环一次都不进,words 为空,result 保持空值——这符合预期,但若下游假设至少有一个单词,就可能崩。

















