我正在尝试编写一个在字符串中每次找到字符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
答案 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!