2011-02-27 228 views
7
void GameBoard::enterShips() 
{ 
    char location[1]; 
    int ships = 0; 
    int count = 1; 

    while(ships < NUM_SHIPS) 
    { 
     cout << "Enter a location for Ship " << count << ": "; 
     cin >> location; 
     cout << endl; 

     Grid[location[0]][location[1]] = SHIP; 
     ships++; 
     count++; 
    } 
} 

我正在寫一個戰艦遊戲。我有電路板佈局工作和計算機隨機生成的船隻。現在我正在研究這種方法來提示用戶輸入船的座標當我運行程序時,它允許我輸入5艘船。當我進入第六艘船時,它給了我這個錯誤。堆棧周圍的變量''已損壞

圍繞可變位置的棧被破壞。

我在網上尋找答案,並沒有發現任何獨家。

任何幫助,將不勝感激。

+0

而是試着去'字符的位置[1] [2];' - 這會給你一個1×2陣列(索引:0 ] [0]和[0] [1]) – RageD 2011-02-27 21:02:25

回答

5

您提示location數組的內存地址到你的用戶。你應該問分開位置索引:

void GameBoard::enterShips() 
{ 
    int location[2]; 
    int ships = 0; 
    int count = 1; 

    while(ships < NUM_SHIPS) 
    { 
     cout << "Enter a location for Ship " << count << ": "; 
     cin >> location[0]; 
     cin >> location[1]; 
     cout << endl; 

     Grid[location[0]][location[1]] = SHIP; 
     ships++; 
     count++; 
    } 
} 

通知int location[2];因爲尺寸1的陣列只能容納一個元素。我也將元素類型更改爲int。從控制檯讀取char將導致ASCII值,這可能不是你想要的。

+0

謝謝,我不知道你可以這樣做。 – bluetickk 2011-02-27 21:35:30

12

location是單個的數組char
沒有location[1]

3

您使location變量只能保存單個字符。您訪問它期望它至少保留2個字符。如果您在使用cin和期待準確讀數爲兩個字符,一個更好的方法是:

char locationX, locationY; 
// ... 
std::cin >> locationX >> locationY; 
// ... 
Grid[locationX][locationY] = SHIP; 
3
cin >> location; 

location是一個char的陣列。這不能成功,因爲當你從一個數據流讀入一個char數組時,必須添加一個空終止符(需要一個字符)。你將不可避免地超越數組的邊界。

可以使用std::string,這將幫助你避免任何緩衝區溢出問題:

std::string location; 
if (!(std::cin >> location)) { 
    // handle input error 
} 

還請注意,你可能需要將數字的字符串表示轉換成數值。您可以輕鬆地做到這一點通過從流中讀取爲兩個int對象,而不是:

int x_location, y_location; 
if (!(std::cin >> x_location >> y_location)) { 
    // Handle input error 
} 

if (x_location >= X_DIMENSION || x_location < 0 || 
    y_location >= Y_DIMENSION || y_location < 0) { 
    // Handle out-of-range error 
} 

// use x_location and y_location 
相關問題