我正在编写一个小游戏;但是stringname.erase()似乎没有在'for-loop'中工作,我想了解原因,我还有其他选择,但我不明白以下代码中发生了什么。
我的情况的更多说明(重要!):
猜是一个char。 'tmgword'和'word'的类型为string,并且:tmgword = word;
我从代码中理解的是:
第一次,'while'循环验证字符串'tmpgword'中是否有'guess'。 这是真的,for循环工作正常,验证if条件的正确字符(猜测)是否已被删除。
第二次:'while'循环再次验证字符串'tmpgword'中是否有'guess'。 这是真的,因此我们再次进入'for-loop';然后进入'if'-block(找到正确的char)但是这里erase()不起作用,我们进入无限循环。
当程序使用'for-loop'找到正确的索引时,我会中断,并且我会从头开始搜索,以防出现更多猜测。
问题是:程序再次发现'猜测',但擦除()不会删除它!
请有人解释一下。这是我的代码:
while (tmpgword.find(guess,0) != string::npos )
{
for (i = 0; i < word.size(); i++) // verify the input;
{
if (word[i] == guess)
{
encword[i] = word[i];//I don't think this line is important
tmpgword.erase(tmpgword.begin() + i);
break;
}
}
}
答案 0 :(得分:4)
首次删除后,tmpgword
中的字符位置与word
中的字符位置不同。
string::find()
会在找到元素后返回该元素的位置,因此您可以使用该元素而不是循环遍历word
。
size_t pos = 0;
while ((pos = tmpgword.find(guess, pos)) != string::npos) {
tmpgword.erase(pos, 1);
}
我已经使用pos
作为每次find()
来电的起始位置,所以它从刚删除的地方开始,而不是每次都从头开始搜索(可以&#39}在此之前是任何事件,因为它们都已被删除了。