C++ 如何以特定字符串'11'为分隔符分割字符串并修复多余空格问题
核心问题定位
你遇到的异常输出是代码逻辑存在三个明确的硬伤导致的:
- 逻辑适配错误:你当前需求是用长度为2的字符串"11"作为分割边界,但是传参设计用的是单字符
char dl的分隔逻辑,从参数设计层就和实际需求不匹配 - 遍历过程中随意修改原字符串内容:检测到连续两个'1'匹配后,你把对应位置的字符赋值为
0(也就是空终止符\0),但循环没有跳过这两个已经被修改的位置,后续遍历走到该位置时,会把这个空字符直接拼接到当前累积的子串中,最终vector里存的内容是带空字符的,输出时就表现为看起来像多余的空格 - 入栈判断逻辑恒成立:你写的判断条件
if (word != "1" || word != "0" )在逻辑上永远为真——任意字符串不可能同时等于"1"和"0",这个判断根本起不到过滤无效内容的作用
修复后的实现思路
不需要用单字符当分隔符参数,直接按规则匹配"连续两个1"作为分割边界:每检测到一处连续的"11",就把从上一次分割结束位置到当前"11"末尾的整段作为一个子串存入数组,全程不修改原字符串的字符内容,匹配后直接跳过已处理位置的重叠判断,自然不会出现多余的空字符,也不会错误切分重叠的字符段。
可直接运行的修复代码
#include <vector> #include <iostream> #include <string> using namespace std; vector<string> splitStrings(const string& str) { vector<string> substr_list; int str_len = str.size(); int segment_start = 0; int i = 0; // 从左到右遍历字符串,匹配连续的"11"分割边界 while (i < str_len - 1) { if (str[i] == '1' && str[i+1] == '1') { // 切出从当前段起始位置到边界末尾的整段子串 substr_list.push_back(str.substr(segment_start, i + 1 - segment_start + 1)); // 更新下一段的起始位置,跳过已处理的两个1 segment_start = i + 2; // 直接把遍历指针移到下一段的起始位置,避免重复匹配重叠的1 i = segment_start; } else { i++; } } return substr_list; } int main(){ string str1 = "1110110011"; vector<string> result = splitStrings(str1); for (const string& s : result) { cout << s; } return 0; }
运行后拼接输出的内容会和原字符串"1110110011"完全一致,分割得到的数组元素正好是["11", "1011", "0011"],没有多余的空字符或空格。
内容的提问来源于stack exchange,提问作者Vuong Nguyen
相关产品推荐
相关产品推荐

