C++ 按空格拆分std::string生成std::map键的问题咨询
原拆分逻辑的错误根源
多段姓名拆分错误的核心原因是截取子串的起始位置固定为字符串头部:
- 每次找到空格位置后,固定执行
names.substr(0, pos),从字符串开头截取到当前空格的内容作为姓名 - 当字符串包含两个以上分隔空格时,后续找到的空格位置逐步靠后,截取得到的片段会自动包含之前已处理的所有姓名内容,最终输出
John、John Paul、Andrew,和你实际遇到的错误结果完全吻合。
可直接替换的修复实现
有成熟的替换方案,无需推翻原有循环结构,只需维护一个记录切割起始位置的游标,将原逻辑中substr(0, pos)替换为从游标位置开始的截取操作即可,完整实现如下:
std::map<std::string, int> scoreboard; std::string input_names = "John Paul Andrew"; // 记录当前片段的切割起始位置,初始为字符串头部 std::string::size_type seg_start = 0; while (seg_start < input_names.size()) { // 从当前切割位置开始查找分隔空格 std::string::size_type space_pos = input_names.find(" ", seg_start); if (space_pos == std::string::npos) { // 没有剩余空格,截取最后一段姓名存入map std::string name = input_names.substr(seg_start); scoreboard[name] = 0; break; } // 替换原substr(0, pos):从切割起始位置,截取到当前空格位置的长度 std::string name = input_names.substr(seg_start, space_pos - seg_start); scoreboard[name] = 0; // 移动游标跳过当前空格,准备下一段切割 seg_start = space_pos + 1; }
通用适配说明
- 该逻辑可直接适配多字符分隔符的拆分需求,仅需将
find方法的查找目标替换为对应分隔字符串(如"||"、", "),截取长度的计算逻辑无需改动 - 同步修复原代码循环边界
i < names.size() - 1的越界风险,空字符串输入时不会触发未定义行为 - 输入
"John Paul Andrew"时,最终拆分结果为三个独立姓名John、Paul、Andrew,可正常作为键存入std::map
内容的提问来源于stack exchange,提问作者EmreTech
相关产品推荐
相关产品推荐

