【问题标题】:member function erase() not working in a loop成员函数擦除()不在循环中工作
【发布时间】:2015-09-30 16:13:01
【问题描述】:

我正在编写一个小游戏;但是 stringname.erase() 似乎在 'for-loop' 中不起作用,我想了解原因,我还有其他选择,但我不明白以下代码中发生了什么。

我的情况的更多解释(重要!):

guess 是一个字符。 'tmgword' 和 'word' 是字符串类型,并且:tmgword = word;

我从我的代码中了解到的:

在第一次,'while'循环验证字符串'tmpgword'中是否有'guess'。 这是真的,for 循环工作正常,验证 if 条件的正确字符(猜测)被删除。

第二次:'while'循环再次验证字符串'tmpgword'中是否有'guess'。 这是真的,因此我们再次进入“for-loop”;然后进入'if'-block(找到正确的字符)但是这里erase()不起作用,我们进入了一个无限循环。

当程序使用'for-loop'找到正确的索引时,我会中断,并从头开始搜索,以防出现更多猜测。

问题是:程序再次找到 'guess' 但 erase() 不会删除它!

谁能解释一下。这是我的代码:

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

            }
        }

【问题讨论】:

  • 删除tmpgword中的字符后,它不再等于word。所以word 中的位置与tmpgword 中的位置不匹配。
  • .tmpgword.find() 返回找到字符时的位置。你为什么不把它放在一个变量中并删除那个位置呢?
  • 我犯了一个错误 ==> 我多次更改我的代码,我找到了更好的解决方案,但我想知道为什么这段代码不能正常工作; (编码了3个多小时),我失去了注意力,我没有意识到这个错误,谢谢,我明白现在是怎么回事了。

标签: c++ string loops erase


【解决方案1】:

第一次擦除后,tmpgword 中的字符位置与word 中的不同。

string::find() 在找到元素时返回它的位置,因此您可以使用它而不是循环遍历 word。

size_t pos = 0;
while ((pos = tmpgword.find(guess, pos)) != string::npos) {
    tmpgword.erase(pos, 1);
}

我使用pos 作为每次调用find() 的起始位置,因此它从刚刚擦除的位置开始,而不是每次都从头开始搜索(在此之前不能出现任何情况,因为它们都被删除了)。

【讨论】:

  • @Galik 谢谢。我讨厌使用没有括号匹配的编辑器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多