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




