You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:25:22