PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2017/07/08 15:10:15
Name 세잎클로버
Subject [질문] 프로그래밍 질문입니다.
#include
#include
typedef struct people{
        char name[100];
        char phonenumber[100];
}contents;

void face(void)
{
        printf("nn***** Menu *****n");
        printf("1. Insert  n2. Delete  n3. Search  n4. Print All  n5. Exitnnn");
}

int scan(void)
{
        int a;
        scanf("%d", &a);
        return a;
}

void clear(void)
{
        while (getchar() != 'n');
}
/* 전화번호부 프로그램 작성
1. 입력 2. 삭제 3. 해당이름 출력 4. 전체출력

일단 이것부터*/

int main()
{
        int a;
        face();
        int b = 1, d = 0;;
        char c[100];
        contents * ptr1 = (contents *)malloc(sizeof(contents)*b );
        while (1)
        {
                printf("menu select : ");
                a = scan();//메뉴얼 번호 받자
                
                if (a == 1)
                {
                        ptr1 = (contents*)realloc(ptr1, sizeof(contents)*b);
                        printf("input name : ");
                        scanf("%s", ptr1[b - 1].name);
                        clear();
                        printf("input phonenumber : ");
                        scanf("%s", ptr1[b - 1].phonenumber);
                        b++;
                        
                }
                if (a == 2) // 이름 삭제 문자열 비교 동적할당 해제
                {
                        printf("input name :");
                        scanf("%s", c);
                        d = 0;
                        while (d < b)
                        {
                                if (!strcmp(c, ptr1[d].name))
                                {
                                        free(ptr1[d].name);
                                        free(ptr1[d].phonenumber);

                                }
                                d++;
                        }
                }
                
                if (a == 3)
                {
                        printf("Input name :");
                        scanf("%s", c);
                        d = 0;
                        while (d < b){
                                if (!strcmp(c, ptr1[d].name))
                                {
                                        printf("%sn", ptr1[d].name);
                                        printf("%s", ptr1[d].phonenumber);

                                }
                                d++;
                        }
                        
                }
                
        }
}
여기서 메뉴 2번 딜리트 선택하고
이름 쓰고 그 이름 맞는 문자열 비교해서 맞는 문자열 찾아내면
동적할당 해제 시키려고 하는데 자꾸 오류가 납니다..
도와주세요 ㅜ

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
그럴거면서폿왜함
17/07/08 15:49
수정 아이콘
ptr1[d].name, ptr1[d].phonenumber가 아니라 ptr1을 해제하는게 맞을 거 같네요
AirQuick
17/07/08 16:01
수정 아이콘
malloc으로 받은 포인터만 free로 해제시킬 수 있습니다.
또한 malloc으로 받은 포인터가 가리키는 메모리 공간 중 일부분만 free로 해제하는 것은 불가능합니다.
따라서 글쓴분이 원하는 것처럼 전화번호를 동적으로 지웠다 썼다 하고 싶다면 realloc으로 하나의 큰 메모리 공간 안에 데이터를 넣지 말고 각 데이터마다 malloc으로 메모리를 할당해줘야겠죠. 구조체 포인터 배열을 만들고 전화번호가 들어오면 배열 하나에 malloc으로 구조체를 만들어서 넣어주는 방식 등으로요.
세잎클로버
17/07/08 16:23
수정 아이콘
아하..;어쩐지 ㅜㅜ 이상하게 네이버 지식인에 검색하고 별 쇼를 다햇는데도 배열 동적할당 해제는 안나오길래 어쩔수없이 여기에 올렷는데..그랬엇군요..

이론상으로는 가능할줄 알앗는데 안되는거엿네요..감사합니다
AirQuick
17/07/08 16:41
수정 아이콘
https://pastebin.com/0cTwu72n

코드를 조금 수정해봤는데 이런 식으로 하시면 될 겁니다.
세잎클로버
17/07/08 16:45
수정 아이콘
나중에 이거 완성하고 봐보겠습니다.문제라서 답을 보면 안될꺼같아요.도움많이 주셔서 정말 감사합니다.
문제풀고 보고 실력 향상에 참조하도록 하겠습니다.정말 감사합니다!
세잎클로버
17/07/11 23:57
수정 아이콘
풀엇슴니다 감사합니다.정말 도움 많이됫습니다.!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct name{

char name[100];
char phone[100];
}name;

int main()
{
name arr1[100];
name arr2;
char subname[100];
int select,height=0,length=0;

while(1)
{
printf("Input Number 1.Insert 2.Delete 3.Search 4.All Print");
scanf("%d",&select);

switch(select)
{
case 1: {
printf("Input Name :");
scanf("%s",arr2.name);
printf("Input Phone: ");
scanf("%s",arr2.phone);

arr1[height]=arr2;
height++;
break;
}

case 2:{
printf("Delete name : ");
scanf("%s",subname);
length=0;
while(length<=height)
{
if(!strcmp(subname,arr1[length].name))
{
arr1[length]=arr1[length+1];

length++;
if(length>=(height-1))
{height--;
}
}
length++;
}
}
break;



case 3 :{
printf("Search Name : ");
scanf("%s",subname);
length=0;
while(length<height)
{
if(!strcmp(subname,arr1[length].name))
{
printf("Name : %s",arr1[length].name);
printf("Phone : %s",arr1[length].phone);
break;

}
length++;
}
break;
}

case 4 :{
length=0;
while(length<height)
{
printf("%d %sn",length+1,arr1[length].name);
printf("%d %s",length+1,arr1[length].phone);
printf("n");
length++;
}
break;
}
}

}}

로 만들엇네요
AirQuick
17/07/12 10:38
수정 아이콘
이렇게 짜도 돌아가긴 하는데 이 코드는 동적할당 없이 미리 구조체 배열을 설정하고 거기에 데이터를 넣는 방식이라 동적할당이 되도록 바꿔보는 것도 공부하는데 좋을 것 같습니다.
세잎클로버
17/07/12 20:43
수정 아이콘
네 감사합니다! 파일 세이브 지금 해보고잇는데 굉장히 감이 안잡히네요 ㅠ
17/07/08 16:59
수정 아이콘
배열 동적할당을 그대로 두시되 배열의 형태를 content**로 content*의 배열로 바꾸시고, 입력이 들어오면 content를 개별로 malloc/free로 할당/해제하는 식으로 하셔도 될 것 같네요.

그리고 본문과 관계는 없지만 옛날에 C를 공부하고 짤 때에는 저도 이렇게 비슷하게 많이 짰었는데, C++과 STL로 삶이 엄청 편해진 것을 새삼 느끼게 되네요.
세잎클로버
17/07/08 20:51
수정 아이콘
감사합니다!머리속에 어떻게 하면 되겟다는 생각나는데 그 어떻게가 어렵네요ㅠ
회색사과
17/07/09 00:19
수정 아이콘
STL 은 축복이죠....

그나마도 요새는 파이썬을 주로 써서...
*이랑& 보면 적응이 안 되네요
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
105427 [질문] 홍대입구쪽 참치회 괜찮은 가게 있을까요 [6] Repppo3123 17/07/08 3123
105426 [질문] 지금 한다는 아재리그 라이브중계 어디서 보죠? [2] 1598 17/07/08 1598
105424 [질문] skt가 롤드컵 나오면 멤버는 누가 나올까요? [13] 만일....100013421 17/07/08 3421
105423 [질문] 이번 롤 리프트라이벌 할때 OGN에서 나오는 퀴즈 모음이 읶을까요? chamchI1686 17/07/08 1686
105422 [질문] 스파이더맨 홈커밍에서 이 장면 나왔나요? [7] 라이디스2686 17/07/08 2686
105421 [질문] 새로운 썰전 패널 어떠신가요? [22] 김수영4284 17/07/08 4284
105420 [질문] 에어컨 인버터 모델 얼마나 이득인가요? [2] 득이3331 17/07/08 3331
105419 [질문] 프로그래밍 질문입니다. [11] 세잎클로버2188 17/07/08 2188
105418 [질문] 모발 혹은 두피 영양제나 관리제는 효과가 있는지요...? [3] nexon3246 17/07/08 3246
105417 [질문] [헬스,장문주의] 초보인데 정체기가 온 듯 합니다. 조언 부탁드립니다. [6] 이나굴5287 17/07/08 5287
105416 [질문] 예비군 가야할까요? 연기할까요? [12] 띠꾸2658 17/07/08 2658
105415 [질문] 공유기 교체 후 질문드립니다. GoThree1449 17/07/08 1449
105414 [질문] 스토리가 있는 모바일 rpg게임 재밌는 거 있을까요 [4] 수풀림4728 17/07/08 4728
105413 [질문] 새 휴대폰을 다른 번호로 바로 사용할 수 있을까요? [9] hoho9na1973 17/07/08 1973
105410 [질문] 약을 계속 먹어야할까요? [9] nekorean2779 17/07/08 2779
105409 [질문] 집들이때 할만한 게임 [17] rollercoaster4128 17/07/08 4128
105408 [질문] 신한 체크카드의 IC 칩이 인식되지 않을 때 해결방법 혹은 신한 체크카드 추천 [3] Cherish7307 17/07/08 7307
105407 [질문] 제주도 여행질문드려요 [3] 사랑2015 17/07/08 2015
105406 [질문] 자영업하시는 분들께 질문드립니다.(카드 결제 관련) [2] 텀블러1985 17/07/08 1985
105405 [질문] 스타1 손속도 늘리는 법 질문드립니다. [6] 스카이바람2887 17/07/08 2887
105403 [질문] 한국에서 캐나다 학자금대출 갚기.. [6] 가렌3653 17/07/08 3653
105402 [질문] 폼롤러에 대한 질문 [6] Paul Pogba2379 17/07/08 2379
105401 [질문] 플스2 작동관련 질문입니다 [4] 밀로세비치2315 17/07/07 2315
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로