2016-05-20 8 views
0

私はCのホテル予約プログラムのようなものを作る作業があります。 基本的に私は2つの構造が必要です。その部屋のID、フロア、ベッドの数、そのようなもの、部屋を予約した人へのポインタとリストその部屋にいる人のリスト)と人のための他の構造人の名前と姓など)。リンクされたリストを構造内に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の参照先は、if(PutGuestInsideList(room->room.list) == false)のNULLです。あなたは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にメンバーroom.listにアクセスしている場合でもroomNULLです。ところで

:使用(または使用することを学ぶ)デバッガ、あなたがより速くあなたのプログラムをデバッグすることができます(それらはデバッガと呼ばれている理由です)

0

私はあなたがチュートリアルを見上げGoogleでいくつかの時間を費やす必要があると思います他の人が指摘しているように、部屋はヌルに設定されていますが、あなたはそれを逆参照します。

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

あなたはまた、これらの行を確認する必要があります。

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

どちらperson.nameperson.nameはで書くためのバッファを与えている彼らは、どこにも指していないポインタがありますが、あなたはそれらを使用しようとします。

関連する問題