코드는 첨부 파일로 올렸습니다.
이미 FAQ에 올려주신 것을 다 읽기는 했습니다만, 그래도 visual studio 2019 상에서 제대로 작동되지 않아서 문의 올립니다.
heap 관련해서 올려진 답변 보고 수정을 해서 3*3 행렬일 때는 visual studio 2019 상에서(물론 파일 확장자는 .c 로 했습니다.) 잘 작동이 되는데
열과 행이 3을 초과하면 matrix를 아예 인식하지 못하고 있습니다.
왜 그런 건가요?
(도장_ 관리자님이 수정함 - 원문 제출일: 2019년 4월 28일, 일요일, 오전 10:02)
scanf_s 안 쓰시면 됩니다. scanf_s는 비표준 함수이므로 사용을 권장하지 않습니다. 자세한 내용은 포럼에서 scanf_s로 검색해주세요. 마이크로소프트는 Visual Studio에서 scanf 사용에 대해 경고를 띄우지만, 표준 함수에 대해 경고를 띄우는 것은 잘못된 정책이라고 생각합니다. 리눅스, 맥 환경에서는 scanf_s 함수는 사용할 수 없습니다. 다른 C 언어 컴파일러는 해당 함수를 지원하지 않습니다.
scanf_s의 함수 사용법이 잘못되었을 겁니다만, scanf_s는 사용하지 않아서 잘 모릅니다. scanf_s 문제에 대해 해결책을 찾으려면 MS 도움말을 참고하셔야 합니다.(C 언어 표준이 아니므로 C 언어 표준 문에서도 없는 함수라서요)
scanf_s를 scanf로 바꾸면 잘 동작합니다.
scanf_s를 쓴 버전에서 중단점을 설정하고, 하단에 조사식 창에서 matrix 배열에 값이 있는지 확인해보면 다음과 같습니다.
먼저 5x5 행렬로 테스트했습니다.
5 5
*....
....*
.....
.....
.....
입력이 이렇게 되었을 때 scanf_s 버전의 코드에 중단점을 설정하고 결과를 보면 다음과 같습니다.
matrix[4][4]는 5x5 행렬의 마지막 값이므로 '.'이 있어야 하는데 0xfe라는 다른 값이 들어가 있습니다. 즉, 입력이 제대로 동작하지 않았습니다.
scanf로 바꿨을 때 같은 중단점에서 값을 조사하면 다음과 같습니다.
조사식 창에서 각각의 행렬 값을 조사해보니 잘 입력되어 있는 것을 알 수 있습니다.
지뢰찾기의 로직 문제가 아니라 입력 받는 함수 scanf_s가 문제의 원인이라는 것을 알 수 있습니다.
UNIT 6을 참고해서 디버거 사용법은 꼭 익히세요. 실무에서도 가장 많이 쓰이고, 버그를 찾는 데 가장 효율적인 수단입니다.