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은 |이 아니고 ||입니다.
댓글 입력