首页 > 解决方案 > 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);
}

我不确定我在哪里犯了导致此错误的错误。这是关于参考吗?

标签: arrayscreferencechar

解决方案


您发布的代码太长,无法进行详细分析,但我可以看到,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

但是,如果您不确切知道遇到问题时会发生什么(以及在哪里),就很难给出更准确的建议。


推荐阅读