[초보]아래꺼 잘못 올려서 다시 올립니다.
글쓴이: woosub21 / 작성시간: 월, 2013/04/08 - 11:53오후
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct infomation{ char name[20]; char phone[30]; }info;//이름과 전화번호를 저장할 구조체 int menu()//메뉴 출력 함수 { printf("*****Menu*****\n"); printf("<1.Registration><2.ShowAll><3.Search>\n"); printf("<4.Deletion><5.Modification><6.Exit>\n"); printf("Enter_the_menu_number:"); return 0; } int get_menu_num()//메뉴번호 선택 함수 { int n; scanf("%d",&n); return n; } int input(int *i,info* in[1000])//초기 입력 함수 { (in[*i])=(info*)malloc(sizeof(info)); printf("Name:"); scanf("%s",in[*i]->name); printf("Phone_number:"); scanf("%s",in[*i]->phone); *i = *i + 1; return 0; } int output(int *i,info* in[1000])//출력 함수 { int l; for(l=0;l<*i;l++){//입력된 순서대로 출력 printf("Name:%s--->Phone_number:%s--->address:%lld\n",in[l]->name,in[l]->phone,&in[l]); } return 0; } int search(int *i,info* in[1000])//검색함수 { int l; char search_name[20]; printf("Name:"); scanf("%s",search_name); for(l=0;l<*i;l++)//입력한 값과 저장된값을 비교후 같은 값이 있으면 이름과 번호 출력 { if(strcmp(search_name,in[l]->name) == 0){ printf("Name:%s--->Phone_number:%s--->address:%lld\n",in[l]->name,in[l]->phone,&in[l]); break; } } return 0; } int del(int *i,info* in[1000])//삭제함수 { int l,k,p=0; char del_name[20]; info* null; printf("Name:"); scanf("%s",del_name); for(l=0;l<(*i);l++){//검색한 이름이 있는지 확인 if(strcmp(del_name,in[l]->name)==0){ for(k=l;k<(*i)-1;k++){//이름이 있다면 다음 배열들을 한칸씩 앞으로 복사 strcpy(in[k]->name,in[k+1]->name); strcpy(in[k]->phone,in[k+1]->phone); p=k; } free(in[p+1]);//배열 복사후 마지막 메모리를 초기화 in[p+1]=in[p+2]; *i = (*i)-1; return 0; } else continue; } return 0; } int modify(int *i,info* in[1000])//수정 함수 { int l; char mody_name[20]; char new_phone[30]; printf("Name:"); scanf("%s",mody_name); for(l=0;l<(*i);l++){//검색한 이름이 있는지 확인 if(strcmp(mody_name,in[l]->name)==0){//있다면 수정할 전화번호 입력받음 printf("New_Phone_number:"); scanf("%s",new_phone); strcpy(in[l]->phone,new_phone);//입력받은 전화번호를 원래 배열에 복사 break; } } return 0; } int main() { int i=0; info* information[1000]; while(1){ menu(); switch(get_menu_num()){ case 1: input(&i,information); break; case 2: output(&i,information); break; case 3: search(&i,information); break; case 4: del(&i,information); break; case 5: modify(&i,information); break; case 6: return 0; } } }
전화번호와 이름을 저장하는 프로그램이고요
구조체 포인터 배열이랑 malloc을 이용해서 만들어야 합니다.
이렇게 코드를 짜면 프로그램은 잘 돌아가는데
막상 채점 프로그램(리눅스기반)에 넣으면 segmentation fault가 뜨더군요 ㅠ
무얼 어떻게 수정해야될지 감이 안와서 ㅠㅠ
Forums:
info *in[1000]이 자꾸 거슬리는데 이거 왜
info *in[1000]이 자꾸 거슬리는데 이거 왜 그렇게 한거죠?
피할 수 있을때 즐겨라! http://melotopia.net/b
읽는 방법이 이럴겁니다.
- 변수'에 크기를 할당하고. 읽고. 사용하는 방법에 대한 이해가 필요해 보입니다.
- 변수의 초기화와 {}의 구분을 잘 구분해주는것이 좋습니다.
- 되도록 변수명은 비슷하지 않게. 지어줘야 합니다.
- segmentation fault 는 배열의 범위를 넘어갈때 발생하는것으로 알고 있습니다.
- 현재 코드는 free()를 실행할때. 액세스 위반이 발생합니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
왜 세그먼테이션 폴트가 날 때 발생하는 메시지는
왜 세그먼테이션 폴트가 날 때 발생하는 메시지는 안적으시죠? 어느 라인에서 발생하는지가 중요한 정보인데요.
예를 들어 ptr->name이라는 코드에서 ptr 이 NULL 이면 발생합니다. 왜 그렇게 되는지 디버깅해보세요.
댓글 달기