밑코드를 복사하셔서 비쥬얼스튜디오에서 돌리면
책을 아무리 새로이 입력해도
두번째 세번째 입력한 데이터는 깨집니다. 첫번째랑 네번째~(무한) 까지는 데이터가 안깨지는걸로봐서 코드에 문제가 없는거같은데...
왜 두번째와 세번째만 그러는지 잘모르겠네요...부탁드립니다 ㅠㅠ
//도서관리 프로그램 구조체(도서명,출간날짜,일련번호,저자) 1.새도서입고 2.도서검색 3.도서정보출력 도서는 조건대로 정렬
//구조체를 새도서입고할때마다 이전 책 개수 값을 저장한 변수 + 1해서 새로이 선언.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book{
char name[50];
int publish_year;
int publish_month;
int publish_day;
int serial_number;
char writer[20];
int *pNext;
};
void Register_New_Book(Book *Database,int *pHow_many);
void Searching_Database(Book *Database,int *pHow_many);
void Output_Book_Info(Book *Database,int *pHow_many);
int main(void)
{
int select=0;
int how_many=0;
int *pHow_many;
pHow_many=&how_many;
Book *Database=(Book*)malloc(sizeof(Book)*((*pHow_many)+1)); // 데이터베이스 하나 증설
while(1)
{
printf("1. 새도서입고\n");
printf("2, 도서검색\n");
printf("3. 도서정보출력\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("새도서입고를 선택하셨습니다.\n");
(*pHow_many)++;
Register_New_Book(Database,pHow_many);
break;
case 2:
printf("도서검색을 선택하셨습니다.\n");
Searching_Database(Database,pHow_many);
break;
case 3:
printf("도서정보출력을 선택하셨습니다.\n");
Output_Book_Info(Database,pHow_many);
break;
default:
break;
}
}
free(Database);
system("pause");
return 0;
}
void Register_New_Book(Book *Database,int *pHow_many)
{
printf(" 제목 = ");
scanf("%s",Database[*pHow_many-1].name);
printf(" 출판 연/월/일 = ");
scanf("%d %d %d",&Database[*pHow_many-1].publish_year,&Database[*pHow_many-1].publish_month,&Database[*pHow_many-1].publish_day);
printf(" 일련번호 = ");
scanf("%d",&Database[*pHow_many-1].serial_number);
printf(" 저자 = ");
scanf("%s",Database[*pHow_many-1].writer);
printf(" 새로운 책\n");
printf(" { %s } 이(가) 등록되었습니다.\n",Database[*pHow_many-1].name);
}
void Searching_Database(Book *Database,int *pHow_many)
{
int choice=0;
int i=0;
Book Search;
//책 제목, 출판 연월일, 일련번호 저자 뭘로 찾을지 검색
//내용은 출력안해도딤 그건 3번에서할것이다.
printf("어떤 정보로 검색하시겠습니까?\n");
printf("1. 책제목\n");
printf("2. 책출판 연/월/일\n");
printf("3. 책일련번호\n");
printf("4. 책저자\n");
scanf("%d",&choice);
if(choice==1)
{
printf("찾으시려는 책 제목 = ");
scanf("%s",Search.name);
for(i=0 ; i<*pHow_many ; i++)
if(strcmp(Database[i].name,Search.name)==0) printf("찾았습니다. 문의하신 { %s } 는 %d번 입니다.\n",Search.name,i+1);
}
else if(choice==2)
{
printf("찾으시려는 책 출판 연/월/일 = ");
scanf("%d %d %d",&Search.publish_year,&Search.publish_month,&Search.publish_day);
for(i=0 ; i<*pHow_many ; i++)
if(Database[i].publish_year==Search.publish_year && Database[i].publish_month==Search.publish_month && Database[i].publish_day==Search.publish_day)
printf("찾았습니다. 문의하신 { %d년 %d월 %d일 } 출판한 책은 { %s } 로, %d번 입니다.\n",Search.publish_year,Search.publish_month,Search.publish_day,Database[i].name,i+1);
}
else if(choice==3)
{
printf("찾으시려는 책 일련번호 = ");
scanf("%d",&Search.serial_number);
for(i=0 ; i<*pHow_many ; i++)
if(Database[i].serial_number==Search.serial_number) printf("찾았습니다. 문의하신 일련번호가 { %d } 인 책 { %s } 로, %d번 입니다.\n",Search.serial_number,Database[i].name,i+1);
}
else if(choice==4)
{
printf("찾으시려는 책 저자 = ");
scanf("%s",Search.writer);
for(i=0 ; i<*pHow_many ; i++)
if(strcmp(Database[i].writer,Search.writer)==0) printf("찾았습니다. 문의하신 저자가 { %s } 인 책은 %d번 입니다.\n",Search.writer,i+1);
}
else
{
printf("제대로 입력 바랍니다.\n");
Searching_Database(Database,pHow_many);
}
}
void Output_Book_Info(Book *Database,int *pHow_many)
{
int search=0;
if(search>*pHow_many || search<0)
{
printf("제대로 입력 바랍니다.\n");
main();
}
printf("찾으시려는 책의 번호 = ");
scanf("%d",&search);
printf("No.%d 의 책 정보\n",search);
printf("제목 = %s\n",Database[search-1].name);
printf("출판 연/월/일 = %d/%d/%d\n",Database[search-1].publish_year,Database[search-1].publish_month,Database[search-1].publish_day);
printf("일련번호 = %d\n",Database[search-1].serial_number);
printf("저자 = %s\n",Database[search-1].writer);
}