arrays - C - 变量“ch1”周围的堆栈已损坏
问题描述
我试图用c做一个国际象棋游戏。这是基本的。这是给我的一个朋友的。但是当我尝试玩游戏时出现此错误:错误是“变量'ch1'周围的堆栈已损坏”。我认为这是关于重载这个 ch1 数组,它是 char 数组(player1() 函数中的数组)。但我不知道我在哪里重载了这个变量。你们能帮我解决这个问题吗?
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int pwstatus[8] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
int pbstatus[8] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
struct piece {
int color; //0 if white, 1 if black, 2 if empty
int type;//1:pawn, 2:rook, 3:knight, 4:bishop, 5:queen, 6:king, 0 if empty
};
char* pieceToChar(piece piece) {
char *ch = (char*)malloc(5);
if (piece.color == 0)
ch[0] = 'W';
if (piece.color == 1)
ch[0] = 'B';
if (piece.color == 2) {
ch[0] = '0';
ch[1] = ' ';
ch[2] = ' ';
ch[3] = ' ';
ch[4] = '\0';
return ch;
}
if (piece.type == 1)
ch[1] = 'P';
if (piece.type == 2)
ch[1] = 'R';
if (piece.type == 3)
ch[1] = 'K';
if (piece.type == 4)
ch[1] = 'B';
if (piece.type == 5)
ch[1] = 'Q';
if (piece.type == 6)
ch[1] = 'G';
ch[2] = ' ';
ch[3] = ' ';
ch[4] = '\0';
return ch;
}
void assignChar(char* char1, char* char2, int n) {
for (int i = 0; i < n; i++) {
char1[i] = char2[i];
}
}
void charToInt(char* char1, int* int1) {
if (char1[0] == 'A') {
int1[0] = 0;
}
if (char1[0] == 'B') {
int1[0] = 1;
}
if (char1[0] == 'C') {
int1[0] = 2;
}
if (char1[0] == 'D') {
int1[0] = 3;
}
if (char1[0] == 'E') {
int1[0] = 4;
}
if (char1[0] == 'F') {
int1[0] = 5;
}
if (char1[0] == 'G') {
int1[0] = 6;
}
if (char1[0] == 'H') {
int1[0] = 7;
}
if (char1[1] == '1') {
int1[1] = 0;
}
if (char1[1] == '2') {
int1[1] = 1;
}
if (char1[1] == '3') {
int1[1] = 2;
}
if (char1[1] == '4') {
int1[1] = 3;
}
if (char1[1] == '5') {
int1[1] = 4;
}
if (char1[1] == '6') {
int1[1] = 5;
}
if (char1[1] == '7') {
int1[1] = 6;
}
if (char1[1] == '8') {
int1[1] = 7;
}
}
void intToChar(int* int1, char* char1) {
if (int1[0] == 0) {
char1[0] = 'A';
}
if (int1[0] == 1) {
char1[0] = 'B';
}
if (int1[0] == 2) {
char1[0] = 'C';
}
if (int1[0] == 3) {
char1[0] = 'D';
}
if (int1[0] == 4) {
char1[0] = 'E';
}
if (int1[0] == 5) {
char1[0] = 'F';
}
if (int1[0] == 6) {
char1[0] = 'G';
}
if (int1[0] == 7) {
char1[0] = 'H';
}
if (int1[1] == 0) {
char1[1] = '1';
}
if (int1[1] == 1) {
char1[1] = '2';
}
if (int1[1] == 2) {
char1[1] = '3';
}
if (int1[1] == 3) {
char1[1] = '4';
}
if (int1[1] == 4) {
char1[1] = '5';
}
if (int1[1] == 5) {
char1[1] = '6';
}
if (int1[1] == 6) {
char1[1] = '7';
}
if (int1[1] == 7) {
char1[1] = '8';
}
}
char intToCharDif(int integer) {
char ch = '0';
if (integer == 0) {
ch = 'A';
}
if (integer == 1) {
ch = 'B';
}
if (integer == 2) {
ch = 'C';
}
if (integer == 3) {
ch = 'D';
}
if (integer == 4) {
ch = 'E';
}
if (integer == 5) {
ch = 'F';
}
if (integer == 6) {
ch = 'G';
}
if (integer == 7) {
ch = 'H';
}
return ch;
}
struct Board{
piece board[8][8];
Board() {
piece piece;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (i < 2)
piece.color = 0;
if (i > 5)
piece.color = 1;
if (j == 0)
piece.type = 2;
if (j == 1)
piece.type = 3;
if (j == 2)
piece.type = 4;
if (j == 3)
piece.type = 5;
if (j == 4)
piece.type = 6;
if (j == 5)
piece.type = 4;
if (j == 6)
piece.type = 3;
if (j == 7)
piece.type = 2;
if (i > 1 && i < 6) {
piece.color = 2;
piece.type = 0;
}
if (i == 1 || i == 6) {
piece.type = 1;
}
board[i][j] = piece;
}
}
}
void print() {
printf("Chess Board: \n");
char ch[5] = "0000";
for (int i = 8; i >= 0; i--) {
if (i == 8)
printf("8 ");
else if (i == 7)
printf("7 ");
else if (i == 6)
printf("6 ");
else if (i == 5)
printf("5 ");
else if (i == 4)
printf("4 ");
else if (i == 3)
printf("3 ");
else if (i == 2)
printf("2 ");
else if (i == 1)
printf("1 ");
else
printf(" ");
for (int j = 0; j < 8; j++) {
if (i == 0)
break;
assignChar(&ch[0], pieceToChar(board[i - 1][j]), 5);
printf("%s", ch);
}
printf("\n");
}
printf(" A B C D E F G H\n");
}
int pawnMove(int r1, int c1) {
char ch;
int mCount = 0;
printf("Press: ");
if (board[r1][c1].color == 0) {
if (pwstatus[c1] == 1)
{
if (board[r1 + 1][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 + 1);
mCount++;
}
if (board[r1 + 2][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 + 2);
mCount++;
}
}
else
{
if (board[r1 + 1][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d, ", ch, r1 + 1);
mCount++;
}
if (board[r1 + 1][c1 + 1].color == 1) {
ch = intToCharDif(c1 + 1);
printf("%c%d, ", ch, r1 + 1);
mCount++;
}
if (board[r1 + 1][c1 - 1].color == 1) {
ch = intToCharDif(c1 - 1);
printf("%c%d, ", ch, r1 + 1);
mCount++;
}
}
}
else {
if (pbstatus[c1] == 1)
{
if (board[r1 - 1][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 - 1);
mCount++;
}
if (board[r1 - 2][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 - 2);
mCount++;
}
}
else
{
if (board[r1 - 1][c1].color == 2) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 - 1);
mCount++;
}
if (board[r1 - 1][c1 - 1].color == 0) {
ch = intToCharDif(c1 - 1);
printf("%c%d, ", ch, r1 - 1);
mCount++;
}
if (board[r1 - 1][c1 + 1].color == 0) {
ch = intToCharDif(c1 + 1);
printf("%c%d, ", ch, r1 - 1);
mCount++;
}
}
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
int rookMove(int r1, int c1) {
int n;
int mCount = 0;
printf("Press: ");
int color = board[r1][c1].color;
n = c1;
char ch;
while (board[r1][n - 1].color == 2)
{
if (n == 0) { break; }
ch = intToCharDif(n - 1);
printf("%c%d , ", ch, r1);
n--;
mCount++;
}
n = c1;
while (board[r1][n + 1].color == 2 && (n + 1) <= 7)
{
ch = intToCharDif(n + 1);
printf("%c%d , ", ch, r1);
++n;
mCount++;
}
n = r1;
while (board[n - 1][c1].color == 2 && n > -1)
{
ch = intToCharDif(c1);
printf("%c%d , ", ch, n - 1);
--n;
mCount++;
}
n = r1;
while ((board[n + 1][c1].color == 2) && ((n) <= 7))
{
ch = intToCharDif(c1);
printf("%c%d , ", ch, n + 1);
++n;
mCount++;
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
int knightMove(int r1, int c1) {
printf("Press: ");
int color = board[r1][c1].color;
char ch;
int mCount = 0;
if (board[r1 + 2][c1 + 1].color == 2) {
ch = intToCharDif(c1 + 1);
printf("%c%d, ", ch, r1 + 2);
mCount++;
}
if (board[r1 + 2][c1 - 1].color != color) {
ch = intToCharDif(c1 - 1);
if ((c1 - 1) > -1) printf("%c%d, ", ch, r1 + 2);
mCount++;
}
if (board[r1 + 1][c1 + 2].color != color) {
ch = intToCharDif(c1 + 2);
if ((c1 + 2) != 8) printf("%c%d, ", ch, r1 + 1);
mCount++;
}
if (board[r1 - 1][c1 + 2].color != color) {
ch = intToCharDif(c1 + 2);
printf("%c%d, ", ch, r1 - 1);
mCount++;
}
if (board[r1 - 2][c1 - 1].color != color){
ch = intToCharDif(c1 - 1);
if ((c1 - 1) != -1)
printf("%c%d, ", ch, r1 - 2);
mCount++;
}
if (board[r1 - 2][c1 + 1].color != color) {
ch = intToCharDif(c1 + 1);
printf("%c%d, ", ch, r1 - 2);
mCount++;
}
if (board[r1 + 1][c1 - 2].color != color) {
ch = intToCharDif(c1 - 2);
printf("%c%d, ", ch, r1 + 1);
mCount++;
}
if (board[r1 - 1][c1 - 2].color != color){
ch = intToCharDif(c1 - 2);
if ((c1 - 2) != -1)
printf("%c%d, ", ch, r1 - 1);
mCount++;
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
int bishopMove(int r1, int c1) {
int a, b;
printf("Press: ");
int color = board[r1][c1].color;
char ch;
int mCount = 0;
a = 1, b = 1;
while (board[r1 - a][c1 + b].color != color)
{
ch = intToCharDif(c1 + b);
if ((r1 - a) == -1 || (c1 + b) == 8) break;
printf("%c%d , ", ch, r1 - a);
a++;
b++;
mCount++;
}
a = 1, b = 1;
while (board[r1 + a][c1 - b].color != color)
{
ch = intToCharDif(c1 - b);
if ((r1 + a) == 8 || (c1 - b) == -1) break;
printf("%c%d , ", ch, r1 + a);
a++;
b++;
mCount++;
}
a = 1, b = 1;
while (board[r1 + a][c1 + b].color != color)
{
ch = intToCharDif(c1 + b);
if ((r1 + a) == 8 || (c1 + b) == 8) break;
printf("%c%d , ", ch, r1 + a);
a++;
b++;
mCount++;
}
a = 1;
b = 1;
while (board[r1 - a][c1 - b].color != color)
{
ch = intToCharDif(c1 - b);
if ((r1 - a) == -1 || (c1 - b) == -1) break;
printf("%c%d , ", ch, r1 - a);
a++;
b++;
mCount++;
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
int queenMove(int r1, int c1) {
char ch;
int mCount = 0;
int x = 1, y = 1, a, b;
printf("Press: ");
int color = board[r1][c1].color;
while (board[r1][c1 - y].color != color)
{
ch = intToCharDif(c1 - y);
if ((c1 - y) == -1) break;
printf("%c%d , ", ch, r1);
y++;
mCount++;
}
y = 1;
while (board[r1][c1 + y].color != color)
{
ch = intToCharDif(c1 + y);
if ((c1 + y) == 8) break;
printf("%c%d , ", ch, r1);
y++;
mCount++;
}
x = 1;
while (board[r1 - x][c1].color != color)
{
ch = intToCharDif(c1);
if ((r1 - x) == -1) break;
printf("%c%d , ", ch, r1 - x);
x++;
mCount++;
}
x = 1;
while (board[r1 + x][c1].color != color)
{
ch = intToCharDif(c1);
if ((r1 + x) == 8) break;
printf("%c%d , ", ch, r1 + x);
x++;
mCount++;
}
a = 1, b = 1;
while (board[r1 - a][c1 + b].color != color)
{
ch = intToCharDif(c1 + b);
if ((r1 - a) == -1 || (c1 + b) == 8) break;
printf("%c%d , ", ch, r1 - a);
a++;
b++;
mCount++;
}
a = 1, b = 1;
while (board[r1 + a][c1 - b].color != color)
{
ch = intToCharDif(c1 - b);
if ((r1 + a) == 8 || (c1 - b) == -1) break;
printf("%c%d , ", ch, r1 + a);
a++;
b++;
mCount++;
}
a = 1, b = 1;
while (board[r1 + a][c1 + b].color != color)
{
ch = intToCharDif(c1 + b);
if ((r1 + a) == 8 || (c1 + b) == 8) break;
printf("%c%d , ", ch, r1 + a);
a++;
b++;
mCount++;
}
a = 1;
b = 1;
while (board[r1 - a][c1 - b].color != color)
{
ch = intToCharDif(c1 - b);
if ((r1 - a) == -1 || (c1 - b) == -1) break;
printf("%c%d , ", ch, r1 - a);
a++;
b++;
mCount++;
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
int kingMove(int r1, int c1) {
char ch;
int mCount = 0;
int color = board[r1][c1].color;
printf("Press: ");
if (board[r1][c1 + 1].color != color) {
ch = intToCharDif(c1 + 1);
printf("%c%d , ", ch, r1);
mCount++;
}
if (board[r1][c1 - 1].color != color) {
ch = intToCharDif(c1 - 1);
printf("%c%d , ", ch, r1);
mCount++;
}
if (board[r1 + 1][c1].color != color) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 + 1);
mCount++;
}
if (board[r1 - 1][c1].color != color) {
ch = intToCharDif(c1);
printf("%c%d , ", ch, r1 - 1);
mCount++;
}
if (board[r1 + 1][c1 + 1].color != color) {
ch = intToCharDif(c1 + 1);
printf("%c%d , ", ch, r1 + 1);
mCount++;
}
if (board[r1 - 1][c1 - 1].color != color) {
ch = intToCharDif(c1 - 1);
printf("%c%d , ", ch, r1 - 1);
mCount++;
}
if (board[r1 - 1][c1 + 1].color != color) {
ch = intToCharDif(c1 + 1);
printf("%c%d , ", ch, r1 - 1);
mCount++;
}
if (board[r1 + 1][c1 - 1].color != color) {
ch = intToCharDif(c1 - 1);
printf("%c%d , ", ch, r1 + 1);
mCount++;
}
if (mCount == 0)
{
printf(" There is no available move!\nTry different piece!\n");
}
return mCount;
}
void change(char* ch1, char* ch2)
{
int temp1[2] = { 0, 0 };
int temp2[2] = { 0, 0 };
charToInt(ch1, &temp1[0]);
charToInt(ch2, &temp2[0]);
piece tempPiece;
tempPiece.color = 2;
tempPiece.type = 0;
board[temp2[1]][temp2[0]] = board[temp1[1]][temp1[0]];
board[temp1[1]][temp1[0]] = tempPiece;
}
void player1()
{
int p1[2];
char ch1[2];
char ch2[2];
printf("\nPLAYER 1 (W)\n");
again1:
int withMove = 1; //if selected piece has no move this will be 0
printf("Select Piece: \n");
scanf("%s", &ch1[0]);
charToInt(&ch1[0], &p1[0]);
switch (board[p1[1]][p1[0]].type)
{
case 1:
withMove = pawnMove(p1[1], p1[0]);
break;
case 2:
withMove = rookMove(p1[1], p1[0]);
break;
case 3:
withMove = knightMove(p1[1], p1[0]);
break;
case 4:
withMove = bishopMove(p1[1], p1[0]);
break;
case 5:
withMove = queenMove(p1[1], p1[0]);
break;
case 6:
withMove = kingMove(p1[1], p1[0]);
break;
default: printf("Incorrect selection! "); goto again1;
}
if (withMove == 0)
goto again1;
scanf("%s", &ch2[0]);
change(&ch1[0], &ch2[0]);
}
void player2() {
int p1[2];
char ch1[2];
char ch2[2];
printf("\nPLAYER 2 (B)\n");
again1:
int withMove = 1; //if selected piece has no move this will be 0
printf("Select Piece: \n");
scanf("%s", &ch1[0]);
charToInt(&ch1[0], &p1[0]);
switch (board[p1[1]][p1[0]].type)
{
case 1:
withMove = pawnMove(p1[1], p1[0]);
break;
case 2:
withMove = rookMove(p1[1], p1[0]);
break;
case 3:
withMove = knightMove(p1[1], p1[0]);
break;
case 4:
withMove = bishopMove(p1[1], p1[0]);
break;
case 5:
withMove = queenMove(p1[1], p1[0]);
break;
case 6:
withMove = kingMove(p1[1], p1[0]);
break;
default: printf("Incorrect selection! "); goto again1;
}
if (withMove == 0)
goto again1;
scanf("%s", &ch2[0]);
change(&ch1[0], &ch2[0]);
}
};
int main()
{
Board board = Board();
char ch;
printf("\n\tWELCOME TO CHESS GAME");
printf("\n\n\t By Berkay ");
_getch();
system("cls");
int x = 0;
do
{
x++;
system("cls");
board.print();
if ((x % 2) == 0)
{
board.player2();
}
else
{
board.player1();
}
printf(" \n\nPress Enter To Continue ! \n\n ");
ch = _getch();
} while (ch == 13);
}
我不确定我在哪里犯了导致此错误的错误。这是关于参考吗?
解决方案
您发布的代码太长,无法进行详细分析,但我可以看到,player1()
并且player2()
您有这样的内容:
char ch1[2];
...
scanf("%s", &ch1[0]);
我只是在推测,但是如果您错误地输入了不止一个字母,ch1
则会溢出,因为它只能接受一个字母和结尾\0
。
而不是处理char[]
或处理char *
只有一个字符相关的信息,也许你应该只使用一个char
?或者至少你应该输入这个字符"%1s"
以防止溢出char ch1[2]
?
此外,在charToInt()
(在输入之后称为)您期望两个字符(char1[0]
和char1[1]
),因此可能需要声明char ch1[3]
并输入 with"%2s"
以存储两个字符和结尾\0
。
但是,如果您不确切知道遇到问题时会发生什么(以及在哪里),就很难给出更准确的建议。
推荐阅读
- python-3.x - Pandas 重新采样/分组按星期几和年份
- azure - 我们可以在 azure 托管的 Web api 中拥有的类对象的内存限制?
- python - 如何使用 .grid 方法将滚动条添加到 tkinter 文本小部件
- python - 为什么即使字符串匹配也不起作用
- c# - Windows 上的 Kestrel 没有响应
- google-apps-script - 选择一个范围,点击谷歌表格中的组合值
- c# - 了解 Visual Studio Web 应用程序中的项目类型
- xamarin.forms - 如何使用 Xamarin.Forms 自定义渲染器在 ButtonOnClick() 中执行平台 (Android) 特定方法。
- javascript - 如何从这个 json 数据中创建两个数组?
- python - 如何使用 pyspark 从 CSV 中使用 Spark 在镶木地板中设置正确的数据类型