如何解决C++反转字符串单词顺序时输出前置多余空格的问题
问题分析与解决
你的代码开头出现多余空格的核心原因是循环索引用错了变量:你用words.size()-1作为循环的起始索引,但words只是最后一个被读取的单词,它的长度是单词本身的字符数,和存储所有单词的temp容器的元素数量完全无关。
举个实际例子:
- 测试输入里,
temp存储了5个单词("My", "name", "is", "Saad", "Arshad"),所以temp.size()是5,合法索引范围是0~4。 - 最后一个单词
"Arshad"的长度是6,所以words.size()-1等于5,循环从i=5开始——这时候访问temp[5]属于越界访问,是未定义行为。 - 当循环到
i=4时,i!=words.size()-1(也就是4!=5)条件成立,会先添加一个空格,再加入temp[4]("Arshad"),这就导致结果开头多了空格(越界访问的内容通常是空或乱码,加上空格后就呈现为开头的空格)。
修正后的代码
把循环逻辑改成基于temp的大小来控制,确保只遍历容器中存在的单词:
#include<iostream> #include<string> #include<vector> #include<sstream> using namespace std; string reverse(string s){ vector<string> temp; string words; stringstream ss(s); while (ss>>words) { temp.push_back(words); } string ans; // 用temp的大小作为循环边界,而非单个单词的长度 for (int i = temp.size()-1; i >=0; --i) { // 仅当不是反转后的第一个单词时,先添加空格 if (i != temp.size()-1) { ans += " "; } ans += temp[i]; } return ans; } int main(){ string s("My name is Saad Arshad "); cout<<reverse(s); return 0; }
或者更直观的写法(先添加反转后的第一个单词,再逐个追加空格+后续单词):
string reverse(string s){ vector<string> temp; string words; stringstream ss(s); while (ss>>words) { temp.push_back(words); } string ans; if (!temp.empty()) { ans = temp.back(); for (int i = temp.size()-2; i >=0; --i) { ans += " " + temp[i]; } } return ans; }
修正后效果
运行修正后的代码,输入"My name is Saad Arshad "会输出:
Arshad Saad is name My
不再有开头的多余空格。
内容的提问来源于stack exchange,提问作者All-Rounder CREW
相关产品推荐
相关产品推荐

