C++如何以7个短横线为分隔符拆分超长摩尔斯电码字符串
摩尔斯电码按单词拆分代码修复方案
原代码错误点
find方法调用逻辑错误:code.find("-------")默认每次从字符串起始位置查找第一个分隔符,叠加到posWordNext会导致位置计算完全偏离预期,正确应该是从上次查找结束的位置posWordPre开始向后查找分隔符。substr参数使用错误:C++的std::string::substr的第二个参数是子串长度,不是子串结束下标,原代码直接传入posWordNext作为第二个参数,会导致截取长度错误。- 未跳过分隔符本身长度:7个短横线的分隔符本身不需要保留在拆分结果中,拆分完成后需要将下一次查找的起始位置跳过7个字符,否则分隔符会被包含到下一个子串的开头。
- 未处理末尾剩余单词:循环跳出后如果还有未提取的最后一个单词,没有对应输出逻辑。
修复后代码
const std::string WORD_SEP = "-------"; const size_t SEP_LEN = WORD_SEP.size(); size_t posWordPre = 0; size_t posWordNext = code.find(WORD_SEP); while (posWordNext != std::string::npos) { // 截取从起始位置到分隔符前的内容 std::cout << code.substr(posWordPre, posWordNext - posWordPre) << std::endl; // 跳过当前分隔符,更新下一次查找的起始位置 posWordPre = posWordNext + SEP_LEN; // 从新的起始位置查找下一个分隔符 posWordNext = code.find(WORD_SEP, posWordPre); } // 处理最后一个单词(如果剩余内容非空) if (posWordPre < code.size()) { std::cout << code.substr(posWordPre) << std::endl; }
输出结果说明
针对你给出的输入字符串,运行修复后代码会得到3个拆分后的单词段,完全符合分隔规则:
l-s-s---s-l---s-s-s s-l---l---l-s-s-s-s-l---l-l-s-s---s---s-s---l-s-l-s---s-s-s-s---s---l-s l-s-l-l-s---s-l-l-s-l-s---l-s-l-l-s-l
内容的提问来源于stack exchange,提问作者Nexxizz
相关产品推荐
相关产品推荐

