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);
}
}
}