You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++程序分割字符串存入vector后,如何去除除首单词外其余单词开头的多余空格?

解决C++单词分割后多余开头空格的问题

嘿,我来帮你搞定这个单词分割的小问题!咱们先看看原代码为啥会出现多余空格,再一步步修复它。

原代码的问题分析

你写的代码里,核心问题出在空格的处理逻辑上:

  • 当遇到空格时,你先给buf加了个多余的'\0'(其实std::string根本不需要手动加这个终止符,它内部会自动处理),然后把buf存入vector,清空buf后,又把当前的空格push_back到了buf里。
  • 这就导致下一个字符开始拼接时,buf里已经有了一个空格,最终后面的单词都带上了开头空格。
  • 另外,原代码还漏掉了循环结束后最后一个单词的存入(因为字符串末尾没有空格,不会触发if分支的添加操作)。

修复后的代码

这里给你调整后的完整代码,我会标注关键修改点:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void addmember(string s) {
    vector<string> vlist;
    string buf;
    for(int i = 0; i < s.length(); i++) {
        if(s[i] == ' ') {
            // 只有当buf不为空时才存入vector,避免连续空格产生空字符串
            if(!buf.empty()) {
                vlist.push_back(buf);
                buf.clear(); // 清空buf准备存下一个单词
            }
        } else {
            // 只有非空格字符才加入buf
            buf.push_back(s[i]);
        }
    }
    // 循环结束后,别忘了存入最后一个单词(字符串末尾没有空格)
    if(!buf.empty()) {
        vlist.push_back(buf);
    }
    // 打印测试
    for(auto it : vlist) {
        cout << it << "\t" << it.size() << endl;
    }
}

int main() {
    string s = "A friend is someone who knows all about you";
    addmember(s);
    return 0;
}

关键修改说明

  • 移除了buf.push_back('\0'):std::string不需要手动添加终止符,这个操作只会让字符串长度莫名增加1,完全没必要。
  • 重构空格处理逻辑:遇到空格时,只处理当前已拼接的单词(非空才存入),不把空格加入buf,而是用else分支专门处理非空格字符的拼接。
  • 添加循环收尾处理:字符串最后没有空格,所以循环结束后要把buf里剩下的最后一个单词存入vector。

修复后的输出

运行这段代码后,输出的每个单词都不会带开头空格,比如:

A       1
friend  6
is      2
someone 7
who     3
knows   5
all     3
about   5
you     3

内容的提问来源于stack exchange,提问作者user15183312

火山引擎 最新活动