참... 오랜만에 만져 보는 C언어.. (리눅스 gcc)
==================================================================================================
#include <stdio.h>
// malloc()과 memset()을 사용하기 위해서 추가
#include <stdlib.h>
#include <string.h>
#define STAR '*'
#define BLANK ' '
char** init(const int size);
void insertStar(char **p, const int size);
void Print(char **p, const int size);
void finish(char **p, const int size);
int main(void)
{
int size = 0;
char **p;
while(1) // 홀수 입력받을 때까지 반복
{
printf("배열의 사이즈를 입력하세요.(홀수만 가능!) ");
scanf("%d", &size);
if((size % 2) == 1)
break;
else
continue;
}
p = init(size);
insertStar(p, size);
Print(p, size);
finish(p, size);
return 0;
}
char** init(const int size)
{
int i;
// 2차원 메모리 초기화
char **p = (char **)malloc(sizeof(char *) * size); // 행 할당 (size = 행)
for(i=0; i<size; ++i) // 행 카운트
{
*(p+i) = (char *)malloc(sizeof(char) * size); // 열 할당 (size = 열)
memset(*(p+i), BLANK, size); // 빈공백 문자(' ')로 초기화
}
return p;
}
void insertStar(char **p, const int size)
{
int i, j, tmp, count;
count = 0;
// 별표 집어넣기
tmp = size / 2;
for(i=0; i<size; ++i)
{
for(j=tmp-count; j<=tmp+count; ++j)
{
p[i][j] = STAR;
}
(i < tmp)? count++ : count--;
}
}
void Print(char **p, const int size)
{
int i, j;
// 출력
for(i=0; i<size; ++i)
{
for(j=0; j<size; ++j)
{
printf("%c", p[i][j]);
}
printf("\n");
}
}
void finish(char **p, const int size)
{
int i;
if(p) // 메모리가 해제 되지 않았다면...
{
// 2차원 메모리 해제
for(i=0; i<size; ++i)
{
free(p[i]); // 행을 날린다.
}
free(p); // 동적 메모리 해제
p = NULL; // 남아 있는 해제된 메모리의 시작 주소를 없앤다. (댕글링 포인터 방지)
}
}
==================================================================================================
'IT_Programming > C · C++' 카테고리의 다른 글
[C] 피보나치 수열 [ Ver. 재귀 / 비재귀 ] (0) | 2009.06.02 |
---|---|
[c] 다이아몬드 지그재그로 출력하기 (출력 문자 : A~Z) (0) | 2009.06.01 |
[C++] 연산자 오버로딩 정리와 예제... (0) | 2009.05.16 |
[펌] 참조자와 포인터 (0) | 2009.04.14 |
[펌] 최적화 코딩 방법 (0) | 2008.12.18 |