2009-04-27 67 views
2

我正在寫一個hang子手遊戲。我的邏輯失敗,無論是我自己還是我的遊戲邏輯。字符猜測(人們猜測的字母)沒有被添加到矢量guessArray的正確內存插槽中。假設該詞是用戶輸入的詞。std :: vector與C++中的原始數組有多類似?

我猜這會工作,如果guessArray是一個原始數組。有沒有一些原因,這不是與矢量工作?

//assume that attempts is num of attempts left 
void coutWord(int attempts, std::string word, char guess) 
{ 
std::vector<char> guessArray(word.length()); 


//this is supposed to add the guess to the correct area of guessArray; 
//It's not. 

for (int i = 0; i < word.length(); i++) { 
    if (guess == word[i]) { 
     guessArray[i] = guess; 
     std::cout << " " << guessArray[i] << " "; 
     continue; 
    } 

    std::cout << " _ "; 
} 

std::cout << std::endl << std::endl; 
} 

編輯:我使用此代碼的目的是來清點所有unguessed空間,在同一個for循環的猜測空間。我只需要「記住」以前的猜測,以便我得到正確的輸出。定的字=「蘋果醬」:

Input: a 
a _ _ _ _ _ a _ _ _ 
Input: p 
a p p _ _ _ a _ _ _ 

+2

這似乎是相當bug的代碼,不管是否guessArray是一個載體或原始陣列。 爲了能夠回答你的問題,你需要說出你在這裏嘗試做什麼。 EG,如果單詞是「Triangulate」,並且猜測是「g」,那麼輸出應該是什麼? – 2009-04-27 03:32:07

+0

那麼我應該通過矢量作爲另一個參數? – jkeys 2009-04-27 03:50:44

回答

3

載體可以用下標符號[]進行索引,並且它被存儲在連續的存儲器。它是一個STL容器,因此,就像數組一樣,您可以擁有任何類型的容器。

矢量自動調整大小。一個數組是'靜態'大小的,並且不能輕易調整大小(除了調用realloc的手動函數外)。您可以使用push_back函數來處理這個問題,並且還可以提前保留()內存以保存重新分配。

數組不會跟蹤它自己的大小,而矢量具有可以檢查它的函數。

如果您不確定矢量的大小,只需繼續並使用.push_back()添加項目以處理自動調整大小的問題。如果通過resize()保留了一塊內存然後索引到內存中,那麼使用它作爲一個數組更容易,但是您將失去將它用作動態大小對象的一些合成優勢。

-1

你應該使用push_back()函數。詳細信息請參見cpprefererence.com

而且,你不能簡單地與C數組替換guessArray,因爲你需要在編譯時已知常數excplicitly指定其大小,像

int guessArray[25]; 
0

應答傳送至編輯:

guessArray向量是在函數中本地創建的,因此,先前插入到向量中將不可用於下一次嘗試。您需要通過引用傳遞向量,併爲每次嘗試更新向量。

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess) 

僞代碼:

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess) 
{ 

    for (int i = 0; i < word.length(); i++) 
    { 
     if (guess == word[i]) 
     { 
      //its current guess 
      //insert and display as well 
      guessArray[i] = guess; 
      std::cout << " " << guessArray[i] << " "; 

     } 
     //Check if the previous attempt has already inserted the char (previous guess) 
     else if(guessArray[i] != 0) 
     { 
      //display previous guess too 
      std::cout << " " << guessArray[i] << " "; 

     } 
     else 
     { //not yet guessed 
      std::cout << " _ "; 
     } 
    } 

    std::cout << std::endl << std::endl; 
} 

外面定義矢量:

std::vector<char> guessArray(word.length()); 

    coutWord(guessArray, 1, word, 'a'); 
2

有在你的代碼的基本邏輯上的缺陷,無法使用向量或陣列。

有你想在這裏做兩項工作:

  • 更新猜測的數組
  • 輸出猜測的陣列

人們很容易搞混,而你試圖在一個函數中完成這兩項任務。我對你的建議是把它們分成不同的功能。

這是一個基本的代碼結構(使用功能,你可以實現):

int attempts = 0; 
std::vector<char> guessArray(word.length()); 
while((attempts > maxAttemps) && (!HasFoundWord(guessArray)) 
{ 
    char guess = InputGuess(); 
    UpdateResults(guessArray, guess, word); 
    OutputGuess(guessArray); 
    ++attempts; 
} 

的UpdateResults將有一個像函數簽名:

void UpdateResults(std::vector<char>& guessArray, char guess, const std::string& word) 

一旦分離出來的功能件,你會發現這個問題要更直接地解決。

0

我很驚訝還沒有人提到這個問題,但性病::向量不是一個數組。這是一個調整大小的連續的元素容器,可用於與數組很相同的目的。如果你想有一個包裹陣列(也有任意數量的原因),你應該看看boost::array

相關問題