Reputation: 19
i have a problem changing the struct that is an array.
I'm working on a library project in C language that need to add a book (Book struct) into a library, I have an array that has all my books, I need to add to this array, my new book.
i did this, could anyone help me , and give me a little bit information about it ?
#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;
}
}
}
every time i compile the code, i have the problem, "expression must be a modifiable lvalue".
thank you
Upvotes: 1
Views: 64
Reputation: 223699
You're attempting to assign an array to another array. That's not legal in C.
If you want to copy the contents of a character array containing a string to another character array, use strcpy
.
strcpy(ptr->name, book_name);
strcpy(ptr->author, author_name);
strcpy(ptr->publisher, publisher_name);
strcpy(ptr->genre, book_genre);
Also note the use of the ->
operator to access a pointer-to-member.
Besides this, you're also not reading these 4 string correctly. The %s
format specifier to scanf
expects a pointer to the first element in a char
array. What you're doing is passing in the address of the array itself.
For this, just pass in the name of the array. The array name decays into a pointer to the first element when passed to a function.
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);
Upvotes: 1
Reputation: 53326
Instead of doing this
(*ptr).name=book_name;
You should copy a string using strcpy
like
strcpy((*ptr).name,book_name);
Also, consider using other safe functions like strncpy()
.
Note use ptr->name
instead of (*ptr).name
.
The ptr->name
is an array, you cannot change array but you can change contents of an array, which is what the error is suggesting.
Upvotes: 1