成员函数erase()不在循环中工作

时间:2015-09-30 16:13:02

标签: c++ string loops erase

我正在编写一个小游戏;但是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;
                }

            }
        }

1 个答案:

答案 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}在此之前是任何事件,因为它们都已被删除了。