“按各单词反序重组排列”指将句子中单词顺序整体反转,而非单词内字母倒序;应使用std::istringstream自动跳过多空格拆词存入vector,再倒序拼接并避免末尾空格。

什么是“按各单词反序重组排列”
这个词组容易误解。它不是把每个单词内部字母倒过来(比如 "hello" → "olleh"),而是把整个字符串中**单词的顺序反转**,即把句子拆成单词列表后,再倒着拼回去。例如:"I love coding" → "coding love I"。确认这点很重要,否则后续逻辑全错。
用 std::istringstream 拆词 + std::vector 存储最稳妥
C++ 标准库没有直接“按空格切分字符串”的单行函数,std::stringstream(或 std::istringstream)是最常用、最可靠的方式。别用 strtok(不安全、非 const 友好)或手写循环(易漏边界)。
- 用
std::istringstream读取单词,自动跳过多空格、制表符、换行符 - 存进
std::vector<:string></:string>,方便反向遍历 - 注意:不要用
std::string::find+substr手动切——遇到连续空格或首尾空格时容易出错
std::string s = " hello world ";
std::vector<std::string> words;
std::istringstream iss(s);
std::string word;
while (iss >> word) {
words.push_back(word);
}
// words 现在是 {"hello", "world"},干净无空串
反向拼接时避免末尾多余空格
把单词倒序输出,常见错误是用 for 循环每轮加一个空格,导致结尾多一个空格。这不是格式问题,某些 OJ 或协议会判错。
- 推荐用
for倒序遍历,第一项不加前缀空格,其余每项前加空格 - 或者用
std::ostringstream,最后用str()提取结果 - 别用
std::string::append(" ")在循环里累积——可读性差且难控制尾空格
std::ostringstream out;
for (int i = words.size() - 1; i >= 0; --i) {
if (i != words.size() - 1) out << ' ';
out << words[i];
}
return out.str(); // 自动处理空格位置
要考虑输入为空、全空格、单个单词等边界情况
实际调用时,用户可能传入空字符串、只有空格的字符串,或不含空格的单个词。这些情况不会崩溃,但输出必须符合预期:
立即学习“C++免费学习笔记(深入)”;
-
""→"" -
" "→""(std::istringstream读不到任何单词,words为空) -
"single"→"single"(words大小为 1,倒序仍是它自己) - 不需要额外判断空字符串——
std::istringstream和空vector的循环天然兼容
真正容易被忽略的是:如果原始字符串含制表符 '\t' 或换行符 '\n',operator>> 仍能正确跳过,无需预处理——这是 std::istringstream 的默认行为,别画蛇添足调用 std::regex_replace 或手动 trim。


















