2013-10-18 208 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()' –