동적할당 사용하기 질문요
유1혹
질문 제목 : malloc함수질문 요약 :malloc함수질문 내용 :
#includestdio.h
#includeconio.h // 그냥 마지막에 getch()
#includestring.h // 검색할때 strcmp함수와 삭제할때 strcpy를 쓰기위해서
#includestdlib.h // 입력을 중단할때 atoi함수를 쓰기위해서
typedef struct date{ // 데이터 구조체
char name[100]; // 이름
char tel[100]; // 전화번호
}date;
int count1=0; // 포인터대용 전역변수
int se; // 검색함수를 위한 전역변수
int ju; // 이어서 입력할건가 새로입력할건가 결정변수
//int uriel=3; // 입력을 많이할수록 구조체배열길이를 늘릴수있게하는 동적할당용 전역변수
char call[20]=삭제된데이터;
void menu1(date *a); // 입력함수
void menu2(date *a); // 삭제함수
void menu3(date *a); // 검색함수
void menu4(date *a); // 출력함수
//void add(date **a,int *boom); // 구조체배열 확장함수
int main()
{
//date *a=(date*)malloc(sizeof(date)*uriel); // 구조체배열 (기본은 date a[3]으로 설정됬음)
date a[100];
char pa; // 입력된 문자복사
char aa[100]; // 이름복사용
char bb[100]; // 전번복사용
int kal=0; // 파일에 저장된 이름,전번을 다시 대입시켜주기위한 변수
int su; // 메뉴얼 선택용
int a1=0; // --x번째데이터--표기용 , 이어서내용입력할시 구조체에 파일의 저장된값을 저장해줌
int a2=1; // --x번째데이터--표기용 , 다용도카운터
FILE *file=fopen(date.txt,a+t); // 파일개방
puts(↓ 전에 입력됬던 데이터들을 출력합니다 ↓\n);
for(;1;)
{
pa=fgetc(file);
if(feof(file)!=0)
break;
if(a1==0) // a1이 0이될때마다
{
printf(--%d번째데이터--\n,a2);
a1++;
}
if(pa==10) // 엔터를 한번만나면
a1++;
if(a1==3) // 엔터가 두번쳐졌을때
{
a1=0; // 엔터를 다시 한번도 안친것처럼 초기화시킴
a2++; // ~번째데이터표기변수가 1씩증가함
}
printf(%c,pa);
}
a1=0;
fclose(file); // 파일을 닫음
file=fopen(date.txt,rt); // 파일을 다시개방
fputs(\n1.위 내용에 이어서 입력을 진행한다 / 2.새롭게 입력을 진행한다 : ,stdout);
for(;1;) // 1,2외에 다른값을 입력했을시 방지
{
scanf(%d,&ju);
if(ju==1) // 이어서 내용을 입력하기로 설정
{
count1=a2-1;
system(cls);
for(;a2!=1;) // 위에서 --3번째데이터--까지 표기했다면 a2=4 루프는 3번돌아야 모두입력됨
{
fseek(file,7,SEEK_CUR); // 이름이 있는 입력칸으로 파일위치지시자 이동
for(;1;)
{
pa=fgetc(file); // 이름이 입력된곳부터 파일을 읽기시작함
if(pa==10) // 엔터(\n)를 만났다면
break; // 빠져나간다
aa[a1]=pa; // 문자 pa를 문자열 aa에 차례차례 저장함
a1++; // 차례차례 저장하기위해 증가시킴
}
aa[a1]=0; // 널문자 삽입
//if(uriel==kal+1) // 배열을 확장해야할때가 오면
//add(&a,&uriel);
strcpy(a[kal].name,aa); // aa에 저장된 문자열(이름부분)을 구조체 a[kal].name에 복사
fseek(file,11,SEEK_CUR); // 전화번호가 있는 입력칸으로 파일위치지시자 이동
a1=0; // 전화번호 문자열을 입력하기위한 초기화
for(;1;)
{
pa=fgetc(file); // 전화번호가 입력된곳부터 파일을 읽기시작함
if(feof(file)!=0) // 파일끝을 만났다면
break; // 빠져나간다
if(pa==10) // 엔터(\n)를 만났다면
break; // 빠져나간다
bb[a1]=pa; // 문자 pa를 문자열 bb에 차례차례 저장함
a1++; // 차례차례 저장하기위해 증가시킴
}
bb[a1]=0; // 널문자 삽입
strcpy(a[kal].tel,bb); // bb에 입력된 전화번호를 구조체 전화번호에 복사
a1=0; // 다른 이름을 입력하기위한 초기화
kal++; // a[0~100].name~tel 까지 저장시키기위함
a2--;
}
puts(1.이어서 입력을 진행합니다\n);
break;
}
else if(ju==2) // 새롭게 내용을 입력하기로 설정
{
system(cls);
puts(2.새롭게 입력을 진행합니다\n);
break;
}
else
{
fputs(1~2중 하나를 입력하세요 다시 입력 : ,stdout);
continue;
}
}
fclose(file);
for(;1;)
{
puts(--------메뉴-------);
puts(-------------1.입력);
puts(-------------2.삭제);
&puts(-------------3.검색);
puts(-------------4.출력);
puts(-------------5.종료);
fputs(선택할 메뉴 : ,stdout);
scanf(%d,&su);
if(su==1)
menu1(&a); // 입력함수 호출
else if(su==2)
menu2(&a); // 삭제함수 호출
else if(su==3)
menu3(&a); // 검색함수 호출
else if(su==4)
menu4(&a); // 출력함수 호출
else if(su==5)
break; // 종료
else
{
puts(\n1~5중 하나를 입력하시오\n);
continue;
}
}
a2=0; // 카운터용 변수로 재활용
file=fopen(date.txt,wt);
for(;a2count1;) // 최종적으로 입력된 정보를 파일에 저장함
{
fprintf(file,이름 : %s\n,a[a2].name);
fprintf(file,전화번호 : %s\n,a[a2].tel);
a2++;
}
fclose(file);
puts(\n\n입력된값을 date.txt파일에 저장하고 프로그램을 마칩니다);
free(a);
getch();
return 0;
} // 메인함수종료void menu1(date *a) // 입력함수
{
int ao=0; // 삭제된 값이 있나없나 검사하는 변수
system(cls);
puts([입력] : 이름을 입력받을때 1을 입력하면 입력중단\n);
for(;ao=count1;ao++)
{
if(strcmp(a[ao].name,call)==0 || strcmp(a[ao].tel,call)==0) // 삭제된값 발견
{
printf(--%d번째 데이터 입력--(삭제됬던데이터)\n,ao+1);
fputs(이름 : ,stdout);
fflush(stdin);
scanf(%s,&a[ao].name);
if(atoi(a[ao].name)==1)// 문자열을 int형으로 변환시 1일경우
{
system(cls);
break;
}
fflush(stdin);
fputs(전화번호 : ,stdout);
scanf(%s,&a[ao].tel);
fflush(stdin);
}
}
for(;1;)
{
printf(--%d번째 데이터 입력--\n,count1+1);
fputs(이름 : ,stdout);
fflush(stdin);
scanf(%s,&a[count1].name);
//if(uriel==count1+1)
//add(&a,&uriel);
if(atoi(a[count1].name)==1)// 문자열을 int형으로 변환시 1일경우
{
system(cls);
break;
}
fflush(stdin);
fputs(전화번호 : ,stdout);
scanf(%s,&a[count1].tel);
fflush(stdin);
count1++;
}
}void menu2(date *a) // 삭제함수
{
int del; // 삭제할 데이터 선택변수
system(cls);
puts([삭제] : x번째 데이터를 삭제함 0이하값일시 삭제작업을 중단);
for(;1;)
{
if(count1==0)
{
system(cls);
fputs(\n입력된 데이터가 하나도없습니다 삭제를 중단합니다\n\n,stdout);
break;
}
fputs(삭제할 데이터 : ,stdout);
scanf(%d,&del);
if(del=0)
{
system(cls);
break;
}
else
{
if(count1del) // 입력된값이 입력한적이 없는 데이터라면
printf(%d번째 데이터는 입력한적이 없습니다\n,del);
else
{
puts(\n↓아래 데이터를 삭제했습니다 ↓\n);
printf(--%d번째데이터--\n,del);
printf(이름 : %s\n,a[del-1].name);
printf(전화번호 : %s\n\n,a[del-1].tel);
strcpy(a[del-1].name,call);
strcpy(a[del-1].tel,call);
}
}
}
}void menu3(date *a) // 검색함수
{
char name1[100]; // 이름검색시 필요한 문자열
char tel1[100]; // 전화번호검색시 필요한 문자열
char total[100]; // 통합검색시 필요한 문자열
int count; // 0~count1까지 검사하는 변수
system(cls);
puts([검색]\n);
for(;1;)
{
if(count1==0)
{
system(cls);
fputs(\n입력된 데이터가 하나도없습니다 검색을 종료합니다\n\n,stdout);
break;
}
fputs(1.이름검색 2.전화번호검색 3.통합검색 0.검색종료 : ,stdout);
scanf(%d,&se);
if(se==1)
{
fputs(이름 : ,stdout);
fflush(stdin);
scanf(%s,name1);
for(count=0;countcount1;count++)
{
if(strcmp(name1,a[count].name)==0)
{
printf(\n찾았습니다 --%d번째데이터--\n,count+1);
printf(이름 : %s\n,a[count].name);
printf(전화번호 : %s\n\n,a[count].tel);
}
}
}
else if(se==2)
{
fputs(전화번호 : ,stdout);
fflush(stdin);
scanf(%s,tel1);
fflush(stdin);
for(count=0;countcount1;count++)
{
if(strcmp(tel1,a[count].tel)==0)
{
printf(\n찾았습니다 --%d번째데이터--\n,count+1);
printf(이름 : %s\n,a[count].name);
printf(전화번호 : %s\n\n,a[count].tel);
}
}
}
else if(se==3)
{
fputs(통합검색 : ,stdout);
fflush(stdin);
scanf(%s,total);
fflush(stdin);
for(count=0;countcount1;count++)
{
if(strcmp(total,a[count].name)==0 || strcmp(total,a[count].tel)==0)
{
printf(\n찾았습니다 --%d번째데이터--\n,count+1);
printf(이름 : %s\n,a[count].name);
printf(전화번호 : %s\n\n,a[count].tel);
}
}
}
else if(se==0)
{
system(cls);
break;
}
else
fputs(메뉴 0~3중 하나를 입력하시오\n,stdout);
}
}void menu4(date *a) // 출력함수
{
int con;
system(cls);
printf([출력] : 총 입력한 데이터는 %d개이며 그 내용을 모두 출력합니다\n\n,count1);
for(con=0;concount1;con++)
{
printf(--%d번째데이터--\n,con+1);
printf(이름 : %s\n,a[con].name);
printf(전화번호 : %s\n,a[con].tel);
}
puts();
}/*void add(date **a,int *boom) // 구조체배열확장
{
int oba=*boom+2; // 배열의 크기를 2늘려주기위한 사전작업
date *temp=(date*)malloc(sizeof(date)*oba); // 실제배열이 될 새로운배열생성
int m; // 반복용 변수
for(m=0;m*boom;m++) // 새로운배열에 기존값을 채워줌
temp[m]=(*a)[m];
free(*a); // 이미 꽉찻던 기존배열삭제
*a=temp; // 기존배열에 배열의크기가 3늘어난 temp대입
*boom+=2;
}*/조금 길수도 있지만 봐주시면 감사해여 ㅜㅜ
지금 초록색으로 칠해진 주석부분의 주석을 풀고 빨간색 date a[100]을 삭제해서 제한을 없애고 싶은대요
동적할당으로 한답시고 뻘짓몇번하다가 결국 책에 나와있는 배열늘리기 예제를 그대로 적용했어요(초록색 주석부분)
그런대 그래도 입력을 2개이상 받질못하네요 힌트만 주셔도 감사하빈다
ps.경고가 24개나 뜨던대 당연한건가요? 왠만하면 경고도 없애갠?없애고싶은대...
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |