틀린부분좀 알려주세요
여울가녘
저장하고 다시 읽어들일때 계속 메모리 오류가 납니다..
어디를 수정하면 좋을지 알려주시면 감사하겠습니다.. ㅠ_ㅠ
#include stdio.h
#include stdlib.h
#include string.h
int save=0;// 저장되어 있는 갯수
#define MAX 10// 저장 갯수 한계치
FILE *fp;
struct number// 번호 저장
{
char* home_tel;// 집
char* cell_tel;// 핸드폰
};
struct user// 정보 저장
{
char* name;// 이름
char* address;// 주소
struct number tel;// 번호
struct user* link;// 다음 개체 링크
} bc;
struct user* head;
int menu_f();// 메뉴함수
void save_f();// 저장함수
void print_f(struct user*);// 출력함수
void search_name();// 탐색(이름)함수
void search_num();// 탐색(번호)함수
void allprint_f();// 모두출력함수
void exit_f();// 종료함수
void input_f();// 파일입력함수
void main()
{
int menu;
input_f();// 파일에서 불러옴
while(1)// 무한루프
{
menu=menu_f();// 메뉴를 불러냄
switch(menu)
{
case 1 : save_f();
printf(\n);
break;
case 2 : search_name();
printf(\n);
break;
case 3 : search_num();
printf(\n);
break;
case 4 : allprint_f();
break;
case 5 : printf(종료합니다.\n);
exit_f();
default : printf( !잘못된 입력입니다.\n);
break;
}
}
printf(\n);
}
/* 메뉴 함수 */
int menu_f()
{
int menu;
printf( □□□□전화번호부 (%d/%d)□□□□ \n, save, MAX);// 저장된 갯수 표시
printf( ■■■■ 1.정 보 입 력 ■■■■\n);
printf( ■■■■ 2.이름으로 찾기 ■■■■\n);
printf( ■■■■ 3.전화번호 찾기 ■■■■\n);
printf( ■■■■ 4.모 두 출 력 ■■■■\n);
printf( ■■■■ 5.프로그램 종료 ■■■■\n\n);
printf(메뉴를 입력하시오 : );
scanf(%d,&menu);// 메뉴 선택
fflush(stdin);
return menu;
}
/* 저장 함수 */
void save_f()
{
int i;
char temp[100];
struct user* t;
i=save;
if(MAX=i)
{
printf( !저장공간이 다 찾습니다.\n);
}
else
{
t=(struct user*)malloc(sizeof(struct user));
head=t;
printf( *이름을 입력하시오 : );
gets(temp);
head-name =(char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-name, temp);
printf( *주소를 입력하시오 : );
gets(temp);
head-address =(char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-address, temp);
printf( *집전화 번호를 입력하시오 : );
gets(temp);
head-tel.home_tel =(char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-tel.home_tel, temp);
printf( *핸드폰 번호를 입력하시오 : );
gets(temp);
head-tel.cell_tel =(char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-tel.cell_tel, temp);
save++;// 핸드폰 번호까지 입력 받은 것 = 번호 1개 저장
if(head-link==NULL)
{
head=t;
head-link=t;
t-link=NULL;
}
else
{
}
}
}
/* 출력 함수 */
void print_f(struct user* p)
{
printf(--------------------------------------\n);
printf( 이 름 : %s\n, p-name);
printf( 주 소 : %s\n, p-address);
printf( 집전화번호 : %s\n, p-tel.home_tel);
printf( 핸드폰번호 : %s\n, p-tel.cell_tel);
printf(--------------------------------------\n);
}
/* 탐색(이름) 함수 */
void search_name()
{
char temp[100];
struct user* p;
p=head;
printf(이름을 입력하세요 : );
scanf(%s, temp);
for (; p!=NULL ; p=p-link)
{
if (!strcmp (temp, p-name))
{
print_f(p);
}
else
{
printf( !당신이 찾는 사람이 없습니다. \n);
}
}
}
/* 탐색(번호) 함수 */
void search_num()
{
char temp[20];
struct user* p;
p=head;
printf(숫자를 입력하세요 : );
scanf(%s, temp);
for (; p!=NULL ; p=p-link)
{
if (!strcmp(temp, head-tel.home_tel) || !strcmp(temp, head-tel.cell_tel))
{
print_f(p);
}
else
{
printf( !당신이 찾는 사람이 없습니다. \n);
}
}
}
/* 모두 출력 함수 */
void allprint_f()
{
struct user* p;
p=head;
if(save==0)
printf( !등록된 정보가 없습니다.\n\n);
for(; p!=NULL ; p=p-link)
{
print_f(p);
}
printf(\n);
}
/* 종료 함수 */
void exit_f()
{
int i=0;
struct user* p;
p=head;
fp=fopen(telbook.txt,w);
ffor(; p!=NULL ; p=p-link)
{
fprintf(fp, %s\n, p-name);
fprintf(fp, %s\n, p-address);
fprintf(fp, %s\n, p-tel.home_tel);
fprintf(fp, %s, p-tel.cell_tel);
i++;
if((i+1)!=save)
fputs(\n\n, fp);// 마지막 줄만 \n입력 안함
// → 이로써 파일입력받을시 마지막 번호정보가
// 반복 되던문제 해결
}
for(; p!=NULL ; p=p-link)
{
free(p-name);
free(p-address);
free(p-tel.home_tel);
free(p-tel.cell_tel);
//동적할당 때문에 받았던 공간을 다시 반납
}
fclose(fp);
exit(1);
}
/* 파일 입력 함수 */
void input_f()
{
int i=0;
char temp[100]={0};
struct user* t;
t=(struct user*)malloc(sizeof(struct user));
head=t;
fp=fopen(telbook.txt,r);
if(fp==NULL)
{
printf(파일 개방 오류!\n\n);
}
else
{
while(!feof(fp))
{
fscanf(fp,%s,temp);
if(strlen(temp)==0)// 처음 맨 첫 줄 입력 받을때
break;// 파일이 빈문서인지 확인!
head-name = (char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-name, temp);
fscanf(fp,%s,temp);
head-address = (char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-address, temp);
fscanf(fp,%s,temp);
head-tel.home_tel = (char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-tel.home_tel, temp);
fscanf(fp,%s,temp);
head-tel.cell_tel = (char*)malloc(sizeof(char)*strlen(temp)+1);
strcpy(head-tel.cell_tel, temp);
i++;
head=t;
head-link=t;
t-link=NULL;
}
}
save=i;// save값은 i값으로 초기화
}