2016-12-27 2 views
1

У меня проблема с изменением структуры, которая является массивом.Как я могу изменить структуру в массиве C?

Я работаю над проектом библиотеки на языке C, которому необходимо добавить книгу (Book struct) в библиотеку, у меня есть массив, в котором есть все мои книги, мне нужно добавить в этот массив новую книгу ,

Я сделал это, может ли кто-нибудь помочь мне и дать мне немного информации об этом?

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

#define BOOK_NUM 50 
#define NAME_LENGTH 200 
#define AUTHOR_NAME_LENGTH 100 
#define PUBLISHER_NAME_LENGHT 50 
#define GENRE_LENGHT 50 

typedef struct _Book 
    { 
    char name[NAME_LENGTH]; 
    char author[AUTHOR_NAME_LENGTH]; 
    char publisher[PUBLISHER_NAME_LENGHT]; 
    char genre[GENRE_LENGHT]; 
    int year; 
    int num_pages; 
    int copies; 
}Book; 

Book books_arr[BOOK_NUM],*ptr=books_arr; 

void add_book() 
{ 
    char book_name[NAME_LENGTH],author_name[AUTHOR_NAME_LENGTH],publisher_name[PUBLISHER_NAME_LENGHT],book_genre[GENRE_LENGHT]; 
    int book_year,book_pages,book_copies,cnt=0,cnt2=0; 
    printf("Please enter book name:\n"); 
    scanf("%s",&book_name); 
    printf("Please enter author name:\n"); 
    scanf("%s",&author_name); 
    printf("Please enter publisher name:\n"); 
    scanf("%s",&publisher_name); 
    printf("Please enter book genre:\n"); 
    scanf("%s",&book_genre); 
    printf("Please enter the year of publishment:\n"); 
    scanf("%d",&book_year); 
    printf("Please enter the number of pages:\n"); 
    scanf("%d",&book_pages); 
    printf("Please enter the number of copies:\n"); 
    scanf("%d",&book_copies); 
    for (ptr=books_arr;ptr<&books_arr[BOOK_NUM];ptr++) 
    { 
     if (strcmp(book_name,(*ptr).name)==0) 
      (*ptr).copies=(*ptr).copies+book_copies; 
     if(strcmp(book_name,(*ptr).name)!=0) 
      cnt++; 
     if((*ptr).name!=NULL) 
      cnt2++; 
    } 
    if(cnt==BOOK_NUM) 
    { 
     if(cnt2==BOOK_NUM) 
      printf("There is no place in the library for this book\n"); 
     if(cnt2<BOOK_NUM) 
     { 
      (*ptr).name=book_name; 
      (*ptr).author=author_name; 
      (*ptr).publisher=publisher_name; 
      (*ptr).genre=book_genre; 
      (*ptr).year=book_year; 
      (*ptr).num_pages=book_pages; 
      (*ptr).copies=book_copies; 
     } 
    } 
} 

каждый раз, когда я скомпилировать код, у меня есть проблема, «выражение должно быть изменяемой именующим».

спасибо

+0

Если у вас есть ошибка, укажите строку, в которой сообщается об ошибке. Нам не нужно было догадываться и разрабатывать это для себя. –

+0

Возможный дубликат [проблемы с char array = char array] (http://stackoverflow.com/questions/7548408/problems-with-char-array-char-array) – halfelf

+1

Оператор стрелки '->' был изобретен, чтобы сделать проще написать код типа 'ptr-> member', а не использовать' (* ptr) .member'. –

ответ

1

Вы пытаетесь присвоить массив другому массиву. Это не является законным в C.

Если вы хотите скопировать содержимое массива символов, содержащего строку, в другой массив символов, используйте strcpy.

strcpy(ptr->name, book_name); 
strcpy(ptr->author, author_name); 
strcpy(ptr->publisher, publisher_name); 
strcpy(ptr->genre, book_genre); 

отметить также использование оператора -> для доступа указатель на член.

Кроме того, вы также не читаете эти 4 строки правильно. Спецификатор формата %s до scanf ожидает указатель на первый элемент в массиве char. То, что вы делаете, проходит по адресу самого массива.

Для этого просто введите имя массива. Имя массива распадается на указатель на первый элемент при передаче функции.

scanf("%s",book_name); 
printf("Please enter author name:\n"); 
scanf("%s",author_name); 
printf("Please enter publisher name:\n"); 
scanf("%s",publisher_name); 
printf("Please enter book genre:\n"); 
scanf("%s",book_genre); 
1

Вместо того чтобы делать это

(*ptr).name=book_name; 

Вы должны скопировать строку, используя strcpy как

strcpy((*ptr).name,book_name); 

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

Примечание ptr->name вместо (*ptr).name.

ptr->name - это массив, вы не можете изменить массив, но вы можете изменить содержимое массива, что и указывает на ошибку.

+2

Будьте осторожны с 'strncpy()' - это не панацея любыми способами. –

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