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

(其在摩尔斯电码中)---(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
4

1 回答 1

0

每次调用 时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;

在线演示

于 2021-07-19T19:25:46.703 回答