You need to enable JavaScript to run this app. C++如何以7个短横线为分隔符拆分超长摩尔斯电码字符串
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:00:01