2011-02-27 161 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 
相关问题