2013-10-18 159 views
0

我正在研究一个项目,需要我在C++中制作Hang子手游戏。我大部分都在工作,但在用户输入猜测后每次都会正确输出拼写错误的部分。我创建了一个类来表示一个hang子手的游戏,在这个类中是确定猜测的方法。如果在字典中随机选择的单词中的任何位置发现猜测,我将该char保存到名为currentWord的矢量中的相同位置。 currentWord在构造函数中被初始化为包含“_”,用于随机选择的单词的长度(这样它与单词的大小相同,我可以在用户键入猜测时更新它)。例如,如果单词是“semicolonialism”,并且用户的第一个猜测是'i',我想用current字符'i'替换currentWord矢量中的'_'。向量超出范围 - C++

string tempWord = word; 
    for (int i = 0; i < tempWord.size(); i++) { 


     u_long location = tempWord.find(guess); 
     currentWord->at(location) = tempWord[location]; 
     tempWord[location] = '_'; 
    } 

我试图做的是将成员变量“word”存储在名为tempWord的临时变量中。然后我从0迭代到tempword的长度。我使用tempWord.find(猜测)来查找tempWord中与猜测匹配的位置,将其存储到称为位置的变量中,然后更新该位置处的currentWord矢量以等于该位置处的tempWord。由于这只会在第一次找到匹配的字符时起作用,所以我将tempWord [位置]更改为'_',这样下次通过时,位置就会有所不同。但通过这样做,我有时会遇到超出范围的错误。如果我评论出

tempWord[location] = '_'; 

然后我看不到这个错误,但只有第一次出现被替换。即使我得到了这个界限错误,我可以在调试器中看到每个事件在currentWord向量中被正确替换。这让我很困惑,所以任何帮助将不胜感激!由于

编辑

由于rapptz建议检查的位置等于的std :: string ::非营利组织,我终于有工作。下面是在地方,检查更新的代码段:

string tempWord = word; 
    for (int i = 0; i < tempWord.size(); i++) { 


     u_long location = tempWord.find(guess); 
     if (location != std::string::npos) { 
      currentWord->at(location) = tempWord[location]; 
      tempWord[location] = '_'; 
     } 

    } 

我真的很喜欢特里斯坦的建议过了,会做,明天最有可能的。一旦我这样做,我会发布更新后的代码,以防其他人可能会觉得它有用。再次感谢!

+4

您需要检查的位置等于'的std :: string :: npos'。 – Rapptz

+0

感谢您的提示!那样做了。如果你真的很快就做出答案,我会接受它。再次感谢 – mike

+1

而不是设置'tempWord [location] ='_'来让它找到下一个匹配,你应该使用一个std :: string :: find()'重载, ,并传递前一场比赛的位置。这样,你只需避免写'tempWord'(这样你就可以避免复制),但它会加快你的搜索速度。 –

回答

0

打算发表评论,但它更容易在一个更大的文本框!你可以同时避免tempWord副本和for循环是这样的:

std::string::size_type location = 0, start_pos = 0; // int would be fine, tbh 

while ((location = word.find(guess, start_pos)) != std::string::npos) { 
    currentWord.at(location) = word[location]; 
    start_pos = location; 
} 
0

我的猜测是,tempword.find(猜测)从1开始到单词的长度,而不是0.请分享该功能。

+2

我的猜测是运行'std :: string :: find()' –