【问题标题】:Cut string in words with ------- as delimiter [duplicate]用--------作为分隔符在单词中剪切字符串[重复]
【发布时间】:2021-09-27 09:19:12
【问题描述】:

你好,我有以下句子,它在一个字符串中,在一行中,但很长:

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-------     

(其在摩尔斯电码中) --- (3x-) 分隔字母, ------- (7x-) 分隔单词。 我怎样才能把很长的代码删掉。

我尝试了以下方法:

    size_t posWordNext{};
    size_t posWordPre{};

    while (true) {
        posWordNext += code.find("-------");
        if (posWordNext >= code.size()) {
            break;
        }
        cout << code.substr(posWordPre, posWordNext) << endl;
        posWordPre = posWordNext;
    }

这是输出:

l-s-s---s-l---s-s-s
-------s-l---l---l-s-s-s-s-l---l-l-s-s
s-s-s-s-l---l-l-s-s---s---s-s---l-s-l-s---s-s-s-s---s---l
---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

【问题讨论】:

  • 你试过了,发生了什么?输出中通常有很好的调试提示。
  • 你永远不会改变code。您是否期望 code.find("-------") 在循环的每次迭代中返回不同的结果?
  • 输出应该是什么?如果输入不正确(例如 6x-)会发生什么。
  • 您阅读过std::string::find 的文档吗?您可以使用一些有趣的重载和默认参数。
  • 这是输出:lss---sl---sss -------sl---l---lssssl---llss ssssl---llss--- s---ss---lsls---ssss---s---l ---s---ss---lsls---ssss---s---ls----- --lslls---sllsls---ls 但在 cmets 它不显示换行符抱歉

标签: c++ find substring


【解决方案1】:

每次调用code.find() 时,都会再次从字符串的开头进行搜索。您不会在每次迭代时修改code,因此find() 每次都会返回相同的偏移量。您应该将posWordPre 传递给find() 的第二个参数作为开始搜索的起始偏移量。

此外,当您调用 code.substr() 时,您将第二个参数视为要停止的偏移量,但该参数实际上需要字符数而不是偏移量。

由于这些错误,您在错误的偏移量处截断了 code 字符串。

试试类似的方法:

size_t posWordPre = 0, posWordNext;

while ((posWordNext = code.find("-------", posWordPre)) != string::npos) {
    cout << code.substr(posWordPre, posWordNext - posWordPre) << endl;
    posWordPre = posWordNext + 7;
}

if (posWordPre < code.size())
    cout << code.substr(posWordPre) << endl;

Online Demo

【讨论】:

  • 哇完美的解决方案,非常感谢
猜你喜欢
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2019-07-25
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多