#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int m,n;
char **n1=malloc(sizeof(char*)*m);
for(int i=0; i<m; i++)
{
n1[i]=malloc(sizeof(char)*n+1);
memset(n1[i], 0, sizeof(char)*n);
}
scanf("%d %d", &m,&n);
for(int i=0; i<m; i++)
{
scanf("%s",n1[i]); //입력받기
}
for(int i=0; i<m; i++) //검사
{
for(int j=0; j<n; j++)
{
if(n1[i][j]=='*')
{
continue;
}
else
{
n1[i][j]=0;
for(int y=i-1; y<=i+1; y++)
{
for(int x=j-1; x<=j+1; x++)
{
if(y<0 || x<0 || y>=m || x>=n)
{
continue;
}
else
{
if(n1[y][x]=='*')
{
n1[i][j]+=1;
}
}
}
}
}
}
}
for(int i=0; i<m; i++)
{
printf("%s\n",n1[i]);
}
for(int i=0; i<m; i++)
{
free(n1[i]);
}
free(n1);
return 0;
}
행렬의 가로 공간에는 문자열이 들어갑니다. 따라서 메모리를 할당할 때는 n + 1(가로 크기 + 1)만큼 할당하여 NULL이 들어갈 공간까지 확보해야 합니다. 이 부분은 'Unit 39 문자열 사용하기'(515쪽), 'Unit 40 입력 값을 문자열에 저장하기'(527쪽)에서 자세히 설명하겠습니다.
Visual Studio에서 컴파일했을 때 하단에 뜨는 경고창을 살펴보세요.
변수 m을 입력 받기 전에 사용하고 있습니다. m에는 쓰레기 값이 있으므로 malloc에서 정상적으로 할당되지 않습니다.
3회독 한다는 생각으로 전체를 통독하세요. 1회에 마스터하기는 어렵고, 여러 번 반복해서 익숙해지는 게 좋습니다.