지뢰찾기 프로그램입니다.
unit38 심사문제입니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int width; // 가로
int lenght; //세로
char ** MineSweeper;
int ** FindNearMine;
int NearMineNumber = 0;
int i, j, k, l;
puts("가로 세로 길이를 입력하시오");
printf("가로: ") ;
scanf("%d", &width);
printf("세로: ");
scanf("%d", &lenght);
//ㅈㅣ뢰찾기 만들기
MineSweeper = malloc(sizeof(char *) * lenght);
for(i = 0; i < lenght; i++)
{
MineSweeper[i] = malloc(sizeof(char) * width + 1);
}
puts("지뢰찾기를 입력하세요");
puts("예시처럼 입력하세요");
printf("*....\n*..*.\n...*.\n.....\n.....\n");
puts("-----------");
for (i = 0; i < lenght; i++) //세로
{
scanf("%s", MineSweeper[i]);
}
//지뢰찾기판별식
FindNearMine = malloc(sizeof(int *) * width); //가로
for(i = 0; i < lenght; i++)
{
FindNearMine[i] = malloc(sizeof(int) * width); //가로
}
//근방의 지뢰개수 찾는 2차배열 호출
for(k = 0; k < lenght; k++) //세로
{
printf("%<%d>", k);
for(l = 0; l < width; l++) //가로
{
// 근방의 지뢰개수 찾기
for(i = k - 1; i <= k + 1; i++)
{
if(i < 0)
continue;
for(j = l - 1; j <= l + 1; j++)
{
if(j < 0)
continue;
if(MineSweeper[i][j] == '*' && MineSweeper[k][l] != '*')
{
NearMineNumber++;
}
}
}
printf("%d", NearMineNumber);
// FindNearMine[k][l] = NearMineNumber;
NearMineNumber = 0;
}
printf(" %d", k);
printf("\n");
}
//위에 for문의 경우 5번째가 아닌4번째 행까지만 출력됩니다.
//근방의 지뢰개수 찾는 2차배열 출력
//이 부분부터는 출력이 안됩니다.
for(k = 0; k < lenght; k++) //세로
{
for(l = 0; l < width; l++) //가로
{
printf("%d", FindNearMine[k][l]);
}
puts("");
}
//할당된 메모리 해제
for(i = 0; i < lenght; i++)
{
free(MineSweeper[i]);
}
free(MineSweeper);
return 0;
}
Visual Studio에서 F5 키를 눌러 디버깅 모드로 시작하면
프로그램에 문제가 발생한 지점에 중단하고 변숫값의 상태를 살펴볼 수 있습니다.
디버거는 개발자라면 필수로 알아야 하는 기능이므로 Unit 6을 참고하세요.
문제의 코드에서
3x3크기에
..*
...
...
을 입력으로 했을 때
예외가 발생하고, 중단된 지점에서 하단 조사식 창에서 로컬을 선택하면 해당 변수의 값을 확인할 수 있습니다.
3x3 행렬이면 i는 0, 1, 2일 때만 유효하고, 3이면 배열의 범위를 벗어나므로 액세스 위반이 발생합니다.
즉, 잘못된 코드입니다.
디버거로 변숫값을 살펴보고 문제가 되는 지점을 찾아 고쳐야 합니다.