c언어 런타임 오류해결

조회수 1414회

run-time check failure #2 - stack around the variable was corrupted 오류가 발생하는데 배열의 int 선언 크기보다 더 커서 발생한다는 것 같은데 어디가 문제인지 모르겠어요..ㅠ

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>

int main()
{
    char map[30][30];
    char hide[30][30];
    int mapsize;
    int level = 0;

    puts("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
    puts("┃    ▤▤ 난이도 선택 ▤▤   ┃");
    puts("┃                            ┃");
    puts("┃        1. 초     급        ┃");
    puts("┃                            ┃");
    puts("┃        2. 중     급        ┃");
    puts("┃                            ┃");
    puts("┃        3. 고     급        ┃");
    puts("┃                            ┃");
    puts("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
    printf(" Select > ");


    while (1) {

        scanf_s("%d", &level);

        if (level == 1) {
            mapsize = 5;
            break;
        }
        else if (level == 2) {
            mapsize = 10;
            break;
        }
        else if (level == 3) {
            mapsize = 25;
            break;
        }
        else
            printf("다시 선택하세요.");

    }

    int a, b, c, d, i, j, k;

    for (i = 0; i < mapsize; i++)
    {
        for (j = 0; j < mapsize; j++)
        {
            map[i][j] = 0;
            hide[i][j] = 99;
        }
    }
    //랜덤으로 지뢰 설치
    srand((unsigned)time(NULL));
    printf("지뢰의 갯수를 입력하세요: \n");
    scanf_s("%d", &k);

    for (i = 0; i < k; i++) {
            a = rand() % mapsize;
            b = rand() % mapsize;
            //지뢰가 존재한다면 횟수를 하나 빼고 다시 반복
            if (map[b][a] == '*') {
                --i;
                continue;
            }
            //지뢰 심기
            else 
                map[b][a] = '*';
    }

    for (int i = 0; i < mapsize; i++)
    {
        for (int j = 0; j < mapsize; j++)
        {
            switch (map[i][j])
            {
                // 만약 맵의 현재 위치에 지뢰가 있다면 8 방을 체크해서 지뢰가 아닌곳은 1을 더해준다.
            case '*':
                if (map[i - 1][j - 1] != '*')
                    map[i - 1][j - 1] += 1;
                if (map[i - 1][j] != '*')
                    map[i - 1][j] += 1;
                if (map[i - 1][j + 1] != '*')
                    map[i - 1][j + 1] += 1;
                if (map[i][j - 1] != '*')
                    map[i][j - 1] += 1;
                if (map[i][j + 1] != '*')
                    map[i][j + 1] += 1;
                if (map[i + 1][j - 1] != '*')
                    map[i + 1][j - 1] += 1;
                if (map[i + 1][j] != '*')
                    map[i + 1][j] += 1;
                if (map[i + 1][j + 1] != '*')
                    map[i + 1][j + 1] += 1;
                break;
            default:
                break;
            }
        }
    }

    while (1) 
    {
        for (int i = 0; i < mapsize; i++)
        {
            for (int j = 0; j < mapsize; j++)
            {
                if (hide[i][j] == 99) {
                    printf("■");
                }
                else if (hide[i][j] == 55) {
                    printf("★");
                }
                else if (hide[i][j] == 11) {
                    printf(" %d", map[i][j]);
                }
                else if (hide[i][j] == 22) {
                    hide[i][j] = map[i][j];
                    printf(" %d", map[i][j]);
                }

            }
            printf("\n");
        }

        printf("x좌표의 값을 입력하세요: \n");
        scanf_s("%d", &c);
        printf("y좌표의 값을 입력하세요: \n");
        scanf_s("%d", &d);

        c--;
        d--;

        //맵 밖의 좌표를 선택
        if ((c >= mapsize) | (c < 0) | (d >= mapsize) | (d < 0))
        {
            printf("맵을 벗어났습니다. 다시 입력하세요\n");
        }

        //지뢰를 고른경우: 게임 끝, 맵 표시
        else if (map[c][d] == '*')
        {
            hide[c][d] = 55;

            for (int i = 0; i < mapsize; i++)
            {
                for (int j = 0; j < mapsize; j++)
                {
                    if (map[i][j] == '*') {
                        printf("★");
                    }
                    else
                        printf("%d ", map[i][j]);
                }
                printf("\n");
            }

            printf("지뢰입니다! \n");
            return 0;
        }

        //정상적으로 클릭 0일떄
        else if (map[c][d] == 0)
        {
            hide[c][d] = 11;
        }
        //지뢰가 아니지만 주위에 지뢰를 감지함
        else 
        {
            hide[c][d] = 22;

        }
        system("cls");
    }

}



  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  •     for (int i = 0; i < mapsize; i++)
        {
            for (int j = 0; j < mapsize; j++)
            {
                switch (map[i][j])
                {
                    // 만약 맵의 현재 위치에 지뢰가 있다면 8 방을 체크해서 지뢰가 아닌곳은 1을 더해준다.
                case '*':
                    if (map[i - 1][j - 1] != '*')
                        map[i - 1][j - 1] += 1;
                    if (map[i - 1][j] != '*')
                        map[i - 1][j] += 1;
                    if (map[i - 1][j + 1] != '*')
                        map[i - 1][j + 1] += 1;
                    if (map[i][j - 1] != '*')
                        map[i][j - 1] += 1;
                    if (map[i][j + 1] != '*')
                        map[i][j + 1] += 1;
                    if (map[i + 1][j - 1] != '*')
                        map[i + 1][j - 1] += 1;
                    if (map[i + 1][j] != '*')
                        map[i + 1][j] += 1;
                    if (map[i + 1][j + 1] != '*')
                        map[i + 1][j + 1] += 1;
                    break;
                default:
                    break;
                }
            }
        }
    

    여기서 i, j 가 모두 0이면 map[i-1][j-1] == map[-1][-1]이 됩니다. 배열의 인덱스가 음수가 안되게끔 처리 해보세요~


    그리고

    if ((c >= mapsize) | (c < 0) | (d >= mapsize) | (d < 0))
    {
        printf("맵을 벗어났습니다. 다시 입력하세요\n");
    }
    

    여기서 논리연산자 OR은 |이 아니고 ||입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)