我有一个任务是制作看起来像C语言中的酒店预订程序的东西。基本上我应该有 2 个结构,一个用于预订酒店房间(包含有关该房间的信息,例如其 ID、楼层、有多少张床之类的东西,指向预订房间的人的指针和将在那个房间里的人名单)和另一个用于人员的结构(其中包含, 比方说,人名姓)。
我遇到的问题是我得到的分割错误,因为我可能没有使这些结构正确。
这是我代码的一部分,应该在列表中添加客人(位于预订结构中):
#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;
}
如果我在解释中遗漏了什么,请在评论中询问我。谢谢!
在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
上的成员room.list
,即使room
NULL
。
顺便说一句:使用(或学习使用)调试器,您将能够更快地调试程序。(这就是为什么它们被称为调试器)
您取消引用了room
,这在行if(PutGuestInsideList(room->room.list) == false)
中为 NULL。不能取消引用 NULL 指针。应在主函数中正确设置room
指针。
我认为你需要花一些时间在谷歌上查找有关 C 中指针的教程。 正如其他人指出的那样,房间设置为 null,但您取消引用它。
Reservations* room = NULL;
// and then
if(PutGuestInsideList(room->room.list) == false)
您还需要查看以下行:
EnterString(newpers->person.name);
EnterString(newpers->person.surname);
person.name
和person.name
都没有写入缓冲区。它们是指针,不指向任何地方,但您尝试使用它们。