2014-10-24 3 views
0

Моей целью было создать адресную книгу, содержащую 10 контактов с использованием структур C. Пользователь должен вставлять контакты один за другим, а моя программа должна печатать всю адресную книгу. Компиляция успешна, но когда я запускаю свою программу, она печатает только первый контакт, а затем я получаю ошибку сегментации. Это мой код:Создание адресной книги с использованием структур C

Файл Ex7.h:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define DIM 10 

struct person { 
    char name[40]; 
    char surname[40]; 
    char date[11]; 
    char number[11]; 
}; 

typedef struct person Person; 

void dataEntry(Person *person); 
void printPerson(Person person); 
void printAddressBook(Person *addbook[10]); 

файл Ex7.c:

#include "ex7.h" 

void dataEntry(Person *person) { 
    printf("Insert name: "); 
    gets(person -> name); 
    printf("Insert surname: "); 
    gets(person -> surname); 
    printf("Insert date of birth [mm/dd/yyyy]: "); 
    gets(person -> date); 
    printf("Insert phone number: "); 
    gets(person -> number); 
} 



void printPerson(Person person) { 
    printf("Name: %s\n", person.name); 
    printf("Surname: %s\n", person.surname); 
    printf("Date of birth: %s\n", person.date); 
    printf("Number: %s\n\n", person.number); 
} 



void printAddressBook(Person *addbook[10]) { 
    for (int i = 0; i < DIM; i++) { 
     printPerson(*addbook[i]); 
    } 
} 

файл main.c:

#include "ex7.h" 

int main(void) { 
    Person* addbook = (Person*) malloc(DIM*sizeof(Person)); 
    printf("DATA ENTRY\n\n"); 
    for (int i = 0; i < DIM; i++) { 
     printf("Person %d:\n", i); 
     dataEntry(&addbook[i]); 
    } 
    printf("\n\nPRINTING ADDRESS BOOK...\n\n"); 
    printAddressBook(&addbook); 
    return 0; 
} 

Тогда я собрал все печатая : gcc -o main main.c ex7.c -std = c99

+1

'лицо * addbook = (лицо *) таНос (DIM * SizeOf (человека));': 'addbook' является указателем на 10 человек. 'Person * addbook [10]': 'addbook' - массив из 10 указателей на Person. – BLUEPIXY

ответ

2

Проблемы заключается в этой части:

void printAddressBook(Person *addbook[10]) { 
    for (int i = 0; i < DIM; i++) { 
     printPerson(*addbook[i]); 
    } 
} 

метод ожидает массив указателей человека, где в главном вы передаете указатель на массив лиц, а не массив людей вы выделили. Меняем метод в:

void printAddressBook(Person *addbook) { 
    for (int i = 0; i < DIM; i++) { 
     printPerson(addbook[i]); 
    } 
} 

И главный называть это так:

printAddressBook(addbook); 
0

Первый НЕ использовать получает. Он устарел и больше не является частью текущего стандарта. fgets отлично работает. Вы должны быть последовательны в том, как вы передаете указатель на свою коллекцию структур на каждую из ваших функций. Кроме того, использование malloc таким образом приведет к жалобам valgrind от Conditional jump or move depends on uninitialised value(s). Вы можете выделить calloc, чтобы гарантировать, что все данные инициализированы до NULL. Один из способов устранения этих проблем заключается в следующем. Новый вход рутина при условии использования getline для получения ввода вместо «получает»:

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

#define DIM 10 

struct person { 
    char name[40]; 
    char surname[40]; 
    char date[11]; 
    char number[11]; 
}; 

typedef struct person Person; 

void dataEntry(Person *person); 
void printPerson(Person *person); 
void printAddressBook(Person *addbook); 

int main(void) { 
    Person* addbook = calloc (DIM, sizeof(Person)); /* calloc initializes all storage */ 
    printf("DATA ENTRY\n\n"); 
    for (int i = 0; i < DIM; i++) { 
     printf("Person %d:\n", i); 
     dataEntry(&addbook[i]); 
    } 
    printf("\n\nPRINTING ADDRESS BOOK...\n\n"); 
    printAddressBook(addbook); 
    if (addbook) free (addbook); 
    return 0; 
} 

/* get string input using getline and write to 'string' */ 
void getinput (char *string) 
{ 
    ssize_t read = 0;     /* values to use with getline  */ 
    char *line = NULL;     /* forces getline to allocate mem */ 
    size_t n = 0;      /* bytes to read, 0 no-limit  */ 
    read = getline (&line, &n, stdin); /* read from stdin with getline  */ 
    if (line[read - 1] == '\n')   /* if newline at end of line  */ 
     { line[read - 1] = 0; read--; } /* strip newline     */ 
    strncpy (string, line, read);  /* copy line w/o linefeed to string */ 
    if (line) free (line);    /* free memory allocated by getline */ 
} 

void dataEntry(Person *person) { 
    printf("Insert name: "); 
    getinput (person -> name); 
    printf("Insert surname: "); 
    getinput (person -> surname); 
    printf("Insert date of birth [mm/dd/yyyy]: "); 
    getinput (person -> date); 
    printf("Insert phone number: "); 
    getinput (person -> number); 
} 

void printPerson(Person *person) { 
    printf("Name : %s\n", person -> name); 
    printf("Surname : %s\n", person -> surname); 
    printf("D.O.B. : %s\n", person -> date); 
    printf("Number : %s\n\n", person -> number); 
} 

void printAddressBook(Person *addbook) { 
    for (int i = 0; i < DIM; i++) { 
     printPerson(&addbook[i]); 
    } 
} 

Кроме того, не забудьте освободить память, выделенную в конце.

выход:

$ ./bin/abook 
DATA ENTRY 

Person 0: 
Insert name: dog 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 12/12/1912 
Insert phone number: 555-1212 
Person 1: 
Insert name: cat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 11/11/1911 
Insert phone number: 555-1212 
Person 2: 
Insert name: rat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 10/10/1910 
Insert phone number: 555-1212 
Person 3: 
Insert name: flat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 09/09/1909 
Insert phone number: 555-1212 
Person 4: 
Insert name: fat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 08/08/1908 
Insert phone number: 555-1212 
Person 5: 
Insert name: bat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 07/07/1907 
Insert phone number: 555-1212 
Person 6: 
Insert name: hat 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 06/06/1906 
Insert phone number: 555-1212 
Person 7: 
Insert name: Matt 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 05/05/1905 
Insert phone number: 555-1212 
Person 8: 
Insert name: george 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 04/04/1904 
Insert phone number: 555-1212 
Person 9: 
Insert name: harry 
Insert surname: fish 
Insert date of birth [mm/dd/yyyy]: 03/03/1903 
Insert phone number: 555-1212 


PRINTING ADDRESS BOOK... 

Name: dog 
Surname: fish 
Date of birth: 12/12/1912 
Number: 555-1212 

Name: cat 
Surname: fish 
Date of birth: 11/11/1911 
Number: 555-1212 

Name: rat 
Surname: fish 
Date of birth: 10/10/1910 
Number: 555-1212 

Name: flat 
Surname: fish 
Date of birth: 09/09/1909 
Number: 555-1212 

Name: fat 
Surname: fish 
Date of birth: 08/08/1908 
Number: 555-1212 

Name: bat 
Surname: fish 
Date of birth: 07/07/1907 
Number: 555-1212 

Name: hat 
Surname: fish 
Date of birth: 06/06/1906 
Number: 555-1212 

Name: Matt 
Surname: fish 
Date of birth: 05/05/1905 
Number: 555-1212 

Name: george 
Surname: fish 
Date of birth: 04/04/1904 
Number: 555-1212 

Name: harry 
Surname: fish 
Date of birth: 03/03/1903 
Number: 555-1212 
Смежные вопросы