이 문제는 이중포인터에 대한 문제입니다. 이중포인터를 사용하여 인자를 전달하는 방법으로
이렇게 쓸 필요는 없으며, 상당히 가독성도 떨어지는 코드입니다.
어떠한 카페에 가서 질답게시판에 가보니 이러한 소스가 올라와 포인터에 대해 잘 알아볼 기회가 될 것같아 만들어본 것입니다.
#include#include void Input(struct Data **D, int *num); //입력 담당 함수 void Output(struct Data **D, int *num); //출력 담당 함수 typedef struct Data { char name[20]; //작가이름 char book[40]; //책이름 int page; //페이지수 }Data; /* 메인함수 */ int main(void) { int number; //입력받을 권수를 저장할 변수 struct Data *D; fputs("몇권을 입력? : ", stdout); scanf("%d", &number); fflush(stdin); //버퍼에 남은 입력을 비움 D=(Data*)calloc(number , sizeof(Data)); if(D==NULL){ puts("메모리 할당 실패!"); exit(1); } Input(&D, &number); Output(&D, &number); free(D); return 0; } /* 데이터 입력 함수 */ void Input(struct Data **D, int *num) { int i; puts("도서 정보 입력"); for(i=0; i<*num; i++) { //저자 입력 fputs("저자:", stdout); fgets(D[i]->name, sizeof(D[i]->name), stdin); /* 이 아래줄은 fgets가 \n까지 저장해 한줄을 띄어버리는 것을 막기 위함임 인터넷에서 참고했음 */ { register char *p; for(p=D[i]->name;*p;p++) if(*p=='\r' || *p=='\n'){ *p = '\0'; break;} } //제목 입력 fputs("제목:", stdout); fgets(D[i]->book, sizeof(D[i]->book), stdin); { register char *p; for(p=D[i]->book;*p;p++) if(*p=='\r' || *p=='\n'){ *p = '\0'; break;} } //페이지수 입력 fputs("페이지수:", stdout); scanf("%d", &D[i]->page); puts(""); fflush(stdin); //버퍼에 남아있는 입력을 비움 } } /* 데이터 출력 함수 */ void Output(struct Data **D, int *num) { int i; puts("도서 정보 출력"); for(i=0; i<*num; i++) { printf("book%d \n",i+1); printf("저자:%s\n",D[i]->name); printf("제목:%s\n",D[i]->book); printf("페이지수:%d\n", D[i]->page); puts(""); } }