main.c:14:2: warning: implicit declaration of function 'scanf_s' is invalid in C99 [-Wimplicit-function-declaration] scanf_s("%d", &num);
scanf_s는 비표준이므로 쓰면 안 됩니다. Visual Studio 외에는 지원하지 않습니다. 대다수 온라인 심사는 리눅스 환경이고 GCC나 Clang을 씁니다. 이들 컴파일러는 scanf_s를 지원하지 않습니다.
scanf로 고쳐도 에러는 계속 발생합니다.
main.c:22:5: error: use of undeclared identifier 'i' m[i] = malloc(sizeof(int) * num); ^Visual Studio에서도 공통인데 이 경우엔 그 위에 코드가 문제인 경우도 종종 있습니다.
for (int i = 0; i < num; i++);
{
m[i] = malloc(sizeof(int) * num);
}
for 문 뒤에 ;이 있습니다. 그러면 블록이 없이 끝나는 한 줄짜리 for 반복문이 됩니다. 그러면 for 블록의 범위는 끝난 것이고, for 문은 종료된 것이므로 for 문 안에서 int i로 선언한 변수 i도 사라집니다. 그게 변수 i는 선언되지 않았다는 오류 메시지의 이유입니다.
이런 식으로 하나씩 살펴보면서 디버깅을 해야 합니다.
UNIT 6 디버거를 사용하거나 포럼 상단에 있는 시각화 사이트를 이용하세요.
UNIT 번호는 38.8입니다. 포럼 오른쪽 상단 검색 상자에 38.8로 검색해서 이전 질문과 답변을 참조하는 것도 방법입니다.
심사문제를 제출했을 때 나오는 해설을 보세요. int **m으로는 숫자 행렬인데, 해설에서는 char **m으로 되어 있습니다. 행렬의 값에는 숫자, '.', '*'이 들어갑니다. 문자와 숫자 모두 들어갑니다. 숫자만 있는 행렬이면 문자를 별도로 처리해야 합니다. 내부적으로 값이 11이면 화면에는 .으로 출력하고, 값이 12이면 *로 출력하는 식의 전처리를 거치는 방식으로 코드를 작성할 수는 있지만, 문제 해결이 어렵겠지요.
그러면 처음 행렬을 입력 받을 때 지뢰 위치로 *이 입력되면 내부에서는 12로 처리해야 한다거나 하는 식의 과정이 추가로 필요합니다. 코드를 더 복잡하게 만드는 요인이 됩니다.
해설을 참고해서 해설에서 제시하는 방법을 이해하면서 코드를 작성하려고 해보세요.