PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2009/04/08 19:21:49
Name 마타하리
Subject 리눅스(fedora10)에서 사용한 c언어 질문입니다.
1 - 10호실 총 10개의 방을 가진 호텔이 있고, 각 방은 자신의 class, charge, num_of_guest, r_guest_name을 가진 구조체로 이루어져있습니다. 처음에 전부 빈방으로 초기화 하고, 간단히 입실, 퇴실을 할 수 있고, 입실현황을 알 수 있게 하려고 했는데 여기서 디버그는 어떻게 할줄 몰라서 제대로 입실, 퇴실이 되는건지도 모르겠고;;; 입실현황을 위해 3번을 선택하면 세그멘테이션 오류라고 뜨네요.

제가 짠 코드는 아래와 같으니 틀린곳이 있으면 조언 부탁드립니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct room{
        int class;
        int charge;
        int num_of_guest;
        char r_guest_name[20];
}room; //10

int main(int argc, char **argv){
        int i;
        int rooms = 10;  // 객실 개수 10개로 초기화
        int num;
        int search; // bool형 대신 사용
        const int charge1 = 10000; // 1등급 룸 가격
        const int charge2 = 7000;  // 2등급 룸 가격        
        const int charge3 = 4000;        // 3등급 룸 가격
        int class;
        char r_guest_name[20];
        char input[20];
        int num_of_guest;
        struct room data[10];     //10개의 방 입력 받을수 있게 배열을 만듬
        FILE *fp; // <-- 저장할 File 디스크립터
        
        for(i=1; i<=rooms; i++){
                data[i].num_of_guest = 0; //빈방으로 초기화
                data[i].charge = 0;
                data[i].r_guest_name[20] = '\0';
                if(i==1||2||3){ data[i].class = 1; data[i].charge = charge1; }
                if(i==4||5||6){ data[i].class = 2; data[i].charge = charge2; }
                if(i==7||8||9||10){ data[i].class = 3; data[i].charge = charge3; }
        }
        while(1){
                printf("----MENU----\n");
                printf("|1.호텔입실|\n");
                printf("|2.호텔퇴실|\n");
                printf("|3.입실현황|\n");
                printf("|4. 종료   |\n");
                printf("------------\n");
                printf("입력 : ");
                fp=fopen("hotel.txt","wb");
                if(fp==NULL)
                        printf("File open error\n");
                else{
                        for(i=1;i<=rooms;i++) // file에 저장
                                fprintf(fp,"%d %d %d\n",data[i].class,data[i].charge,data[i].num_of_guest);
                        fclose(fp);
                }
                scanf("%d",&num);
                switch(num){
                        case 1: //
                                printf("투숙할 룸의 등급을 입력하세요(1-3) : ");
                                scanf("%s", &class);
                                printf("투숙자 명을 입력하세요 : ");
                                scanf("%s", &r_guest_name);
                                printf("투숙객 수를 입력하세요 : ");
                                scanf("%d", &num_of_guest);
                                search = 0;
                                fp=fopen("hotel.txt","w");
                                if(fp==NULL)
                                        printf("File open error\n");
                                else{
                                        for(i=1;i<=rooms;i++){ // 원하는 등급의 방이 비어있을경우 그곳에 저장
                                                if((data[i].class==class)&&(data[i].num_of_guest==0)){                                        
                                                        fprintf(fp,"%d %d %s %d\n", data[i].class, data[i].charge, data[i].r_guest_name, data[i].num_of_guest);
                                                        fclose(fp);
                                                        printf("입실절차가 완료되었습니다. \n");
                                                        search = 1;
                                                        break;
                                                }
                                        }
                                        if(search==0) printf("원하시는 방이 없습니다.");
                                }
                                break;
                        case 2:
                                fp=fopen("hotel.txt","w+");
                                i = 1;
                                search = 0;
                                while(1){ // file로 부터 로드
                                        if(fscanf(fp,"%d,%d,%s,%d",data[i].class, data[i].charge, data[i].r_guest_name, data[i].num_of_guest)==EOF) break;
                                        i++;
                                }
                                fclose(fp);
                                printf("퇴실할 방의 투숙객 명을 입력하십시오 : ");
                                scanf("%s",input);
                                for(i=1; i<=rooms; i++){ // 투숙객 명으로 비교후 삭제
                                        if(data[i].r_guest_name==input){
                                                data[i].charge = 0;
                                                data[i].r_guest_name[20] = '\0';
                                                data[i].num_of_guest = 0;
                                                printf("퇴실절차가 완료되었습니다. \n");
                                                search = 1;
                                        }
                                }
                                if(search==0) printf("입력하신 투숙객 명이 없습니다.");
                                break;
                        case 3:
                                fp=fopen("hotel.txt","r");
                                i = 1;
                                if(fp==NULL){
                                        printf("File open error\n");
                                        return;                                
                                }
                                else{ // file로 부터 로드하며 구조체에 복사, 출력
                                        while((fscanf(fp,"%d %d %s %d",data[i].class, data[i].charge, data[i].r_guest_name, data[i].num_of_guest)!=EOF)){
                                                printf("%d %d %s %d",data[i].class, data[i].charge, data[i].r_guest_name, data[i].num_of_guest);
                                                i++;        
                                        }
                                        fclose(fp);
                                }
                                break;
                        case 4:
                                printf("종료합니다. \n");
                                exit(1);
                }
        }          
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
MoreThanAir
09/04/08 19:34
수정 아이콘
fscanf 에서 정수값을 입력받을 때는 그 주소값을 인자로 넘겨야죠. data[i].class가 아니고 &data[i].class가 맞습니다. 그 외에 charge와 num_of_guest에 대해서도 마찬가지겠네요. 그리고 배열의 시작이 index 0부터 시작이므로 for문 등을 사용할 때 1부터 <=n보다는 0에서 <n으로 사용하는 것이 나중에 편합니다.
지구사랑
09/04/08 21:58
수정 아이콘
MoreThanAir님의 마지막 설명에 조금 덧붙이면... 위의 프로그램을 보면, rooms를 10으로 초기화했고, data[10]이라고 선언했으므로 (data[0] ~ data[9]까지가 만들어졌으므로), 초기화를 위한 첫 번째 for문, for (i=1; i<=rooms; i++) 부터 문제입니다. 즉, 이 문장으로 data[10]을 초기화하려고 하는데, MoreThanAir님의 설명처럼 for (i=0; i< rooms; i++)로 고쳐야 합니다.

초기화 문장 중에 data[i].charge = 0; 은 왜 있는지 모르겠네요? 바로 아래 또 setting하는 부분이 있습니다만... (i==1||2||3과 같은 부분도 뜻하시는 바는 알겠는데, 원하는 대로 동작하지는 않을 겁니다. 왜 그런지는 연산자 우선 순위등을 참조하세요)
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
53480 Ayur 앨범구할수있는방법 있을까요? 이자람2145 09/04/08 2145
53477 pc를 업그레이드 해보려고하는데요.. 조언좀해주세요 [5] 비설향1952 09/04/08 1952
53476 노트북에 CPU 팬조절기를 달려고 합니다. beloved1935 09/04/08 1935
53474 [교통] 시청에서 일산 가기. [3] BuyLoanFeelBride1660 09/04/08 1660
53472 리눅스(fedora10)에서 사용한 c언어 질문입니다. [2] 마타하리1524 09/04/08 1524
53470 c언어 질문입니다. [5] Magic_'Love'2119 09/04/08 2119
53467 훈련소에서 전자시계 필요한가요? [12] 문근영7553 09/04/08 7553
53466 뜬금없지만, '안드로 장' 장재호 선수 여친 관련 질문... [2] 저녁달빛3230 09/04/08 3230
53465 핸드폰(햅틱2) 사려 하는데 조언 부탁드려요. [5] 요비2472 09/04/08 2472
53463 해외에 나가있는 여자친구에게 소포로 선물을 보내려 합니다 [4] 단하나의별3183 09/04/08 3183
53462 내일 소개팅을 합니다... [15] 삭제됨2932 09/04/08 2932
53460 남성적 취향을 가진 여자. [63] ipa4426 09/04/08 4426
53459 grammar in use 라는 책 아시는분 계신가요.. [7] 서현4096 09/04/08 4096
53458 pmp를 사려고 합니다.;; [4] 하늘에속한이2091 09/04/08 2091
53457 와우 주술사 질문입니다 [7] Xepher3322 09/04/08 3322
53456 영어 기초문법 괜찮은 책 추천부탁드립니다~ [13] EsPoRTSZZang2226 09/04/08 2226
53454 음악 추천좀 부탁합니다. [2] zephyrus1871 09/04/08 1871
53453 인터넷에서본 동영상 저장하는법좀 알려주세요 [3] ParasS5745 09/04/08 5745
53452 x-men 원작 만화 [1] JPstyle2985 09/04/08 2985
53451 절친노트에 나왔던 bg 질문입니다. [3] 백화요란3514 09/04/08 3514
53450 캐드용PC 견적 좀 부탁드립니다. [2] 아하?1810 09/04/08 1810
53449 그냥 "친한 오빠 동생 사이인가" [15] 친절한 메딕씨5220 09/04/08 5220
53448 남자와 여자의 차이 [3] 오월2226 09/04/08 2226
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로