2016-05-20 2 views
0

У меня есть задача сделать что-то похожее на программу бронирования гостиницы в C. В принципе, у меня должно быть 2 структуры, одна для бронирования номеров в отеле (которая содержит информацию об этой комнате, такой как ее идентификатор, пол, сколько кроватей и тому подобное, указатель на человека, который зарезервировал номер, и список людей, которые будут в этой комнате), а другая структура для лиц (в которых содержится, скажем, имя и фамилия человека).Ввод связанного списка внутри структуры в C (ошибка сегментации)

Проблема, с которой я столкнулась, - это ошибка сегментации, которую я получаю с тех пор, как я, вероятно, не сделал эти структуры правильными.

Вот часть моего кода, который должен добавить гостя в списке (который находится в структуре резервирования):

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

#define MAXSTR 25 
#define FORMAT_LEN 15 

typedef struct person //structure that holds info about person 
{ 
    char name[MAXSTR + 1]; 
    char surname[MAXSTR + 1]; 
}Guest; 

typedef struct persons // list of persons 
{ 
    Guest person; 
    struct persons* next; 
} Persons; 

typedef struct //Pointer to first person in list 
{ 
    Persons* list; 
} List; 

typedef struct room //structure that holds info about rooms that are reserved 
{ 
    unsigned int ID; 
    unsigned int floor; 
    unsigned int bedcount; 
    struct tm dateArrival; 
    struct tm dateDep; 
    bool cancelled; 
    unsigned int price; 
    Guest* person; 
    List* list; 
}Reservation; 

typedef struct rooms 
{ 
    Reservation room; 
    struct rooms* next; 
} Reservations; 

bool PutGuestInsideList(List* list); 
char* EnterString(char* str); 

int main() 
{ 
    Reservations* room = NULL; 
    List list = { NULL }; 

    printf("New guest: \n"); 
    if(PutGuestInsideList(room->room.list) == false) 
     printf("Try again. \n"); 


} 

bool PutGuestInsideList(List* list) 
{ 
    if(list == NULL) 
     return false; 

    Persons* newpers = (Persons*) malloc(sizeof(Persons)); 
    if(newpers == NULL) 
     return false; 

    printf("Name: "); 
    EnterString(newpers->person.name); 
    printf("Surname: "); 
    EnterString(newpers->person.surname); 

    list->list = newpers; 
    return true; 
} 
char* EnterString(char* str) 
{ 
    if (str == NULL) 
     return str; 

    char format[FORMAT_LEN] = ""; 
    sprintf(format, "%%%u[^\n]", MAXSTR); 

    scanf(format, str); 

    scanf("%*[^\n]"); 
    scanf("%*c"); 

    return str; 
} 

Если есть что-то я оставил в своем объяснении спросить меня в комментариях. Благодаря!

+1

Используйте отладчик, чтобы узнать, где он не работает. – PcAF

+0

Ошибки сегментации вызваны чтением чего-то, на которое указывает указатель ... когда этот указатель неправильно установлен. –

ответ

0

Вы получили разницу room, которая является NULL в строке if(PutGuestInsideList(room->room.list) == false). Вы не можете разыменовать указатель NULL. Указатель room должен быть правильно установлен в вашей основной функции.

0

В main:

int main() 
    { 
    Reservations* room = NULL;//here you initialise pointer with NULL 
    List list = { NULL }; 

    printf("New guest: \n"); 
    if(PutGuestInsideList(room->room.list) == false)// and here you try to access it 
     printf("Try again. \n"); 


} 

В if заявление вы обращаетесь к члену room.list на указатель room даже если room является NULL.

КСТАТИ: Использование (или научиться использовать) отладчик, вы будете иметь возможность отладки программ быстрее (именно поэтому они называются отладчики)

0

Я думаю, что вам нужно потратить некоторое время на Google, глядя вверх учебники. на указателях на C. Как указывают другие, номер установлен в нуль, но вы его разыскиваете.

Reservations* room = NULL; 
// and then 
if(PutGuestInsideList(room->room.list) == false) 

Вы также должны рассмотреть эти строки:.

EnterString(newpers->person.name); 
EnterString(newpers->person.surname); 

Ни person.name, ни person.name дается буфер для записи в них являются указателями, которые не указывают в любом месте, но вы пытаетесь использовать их.

Смежные вопросы