簡體   English   中英

變量''周圍的堆棧已損壞

[英]Stack around the variable ' ' was corrupted

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艘船只。 當我進入第六艘船時,它給了我這個錯誤。

變量位置周圍的堆棧已損壞。

Ive在網上尋找答案,卻沒有發現任何排他的內容。

任何幫助,將不勝感激。

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

您正在向用戶提示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。 從控制台讀取字符將導致ASCII值,這可能不是您想要的。

您使location變量只能容納一個字符。 您訪問它並期望它至少包含2個字符。 如果您使用的是cin並希望准確讀取兩個字符,則更好的方法是:

char locationX, locationY;
// ...
std::cin >> locationX >> locationY;
// ...
Grid[locationX][locationY] = SHIP;
 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM