如何使循环帐户能够多次出现?

时间:2018-08-27 12:32:11

标签: c++

我正在尝试编写一个在字符串中每次找到字符np.add.outer(a,b)时都退格的代码。

我仅有的代码似乎只在它第一次出现时才执行,而在随后的时间里什么也没发生。

请问有关如何修复的任何提示?我可以使用更有效的循环吗?

<

示例输入:

void decodeback(string orig, string search, string replace) {
  size_t pos = 0;
  do {
    pos = orig.find(search, pos);
    if (pos == string::npos)
      break;
    orig.erase(pos, search.length());
    orig.erase(pos - 1, search.length());

    cout << orig << endl;
  } while (pos += replace.length());
}

int main() {
  // input the question
  string question = "What is the message? ";
  // output the answer
  string answer = "The real message is ";

  // special characters
  string shift = "^";
  string back = "<";
  string test = "a";

  // input the coded message
  string answer1;

  // output decoded message
  string answer2;

  cout << question;
  cin >> answer1;
  cout << "decoding ";

  decodeback(answer1, back, test);

  return 0;
}

所需的输出:

hello<<

实际输出:

hel

4 个答案:

答案 0 :(得分:1)

这部分不能满足您的要求:

while(pos += replace.length());

此外,删除两个字符后,pos尚未调整。

这两个意味着您可以跳过'<'个字符。

相反,请尝试:

while (true) {
    pos = orig.find(search, pos);
    if(pos == string::npos)
        break;
    orig.erase(pos--, search.length());
    orig.erase(pos, search.length());

    cout<<orig<<endl;
}

请注意,此代码假定字符串的第一个字符永远不会有'<'字符,否则会发生不好的事情。

它还假设search.length()将始终为1,否则第二个erase调用将不会达到预期的效果。第二个erase调用应该只是:

orig.erase(pos, 1);

答案 1 :(得分:0)

错误是您的循环条件已损坏

while(pos += replace.length())

在更高的层次上,我建议例如使用boost,它们有一些简洁的字符串算法。

例如,参见以下答案: How do I Search/Find and Replace in a standard string?

答案 2 :(得分:0)

如果我理解您的意图正确,那么第一件事就是将以下行移出do-while函数中的decodeback循环。

cout << orig << endl;

这是因为您要在删除找到的所有<之后打印字符串。
如果您不想将<替换为其他任何内容,也可以删除第二个擦除操作,即do-while循环中的以下行。

orig.erase(pos - 1, search.length());

答案 3 :(得分:0)

除了您当前的算法和其他答案外,我想补充一下,您可以始终使用erase-remove idiom使用std::remove。您不必操纵(或跟踪)长度,它会更加习惯和表达。

这是一个例子:

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string s { "Hello!<<" };

    std::cout << "BEFORE: " << s << '\n';

    s.erase( std::remove( s.begin(), s.end(), '<' ), s.end() );

    std::cout << "AFTER : " << s << '\n';

    return 0;
}

输出:

BEFORE: Hello!<<
AFTER : Hello!

实时示例:https://ideone.com/wr9wky