如何更改C数组中的结构?

时间:2016-12-27 03:59:15

标签: 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;
        }
    }
}

每次我编译代码时,我都有问题,“表达式必须是可修改的左值”。

谢谢

2 个答案:

答案 0 :(得分:1)

而不是这样做

(*ptr).name=book_name;

您应该使用strcpy复制字符串,如

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

另外,请考虑使用其他安全功能,例如strncpy()

注意使用ptr->name代替(*ptr).name

ptr->name是一个数组,您不能更改数组,但可以更改数组的内容,这就是错误所暗示的内容。

答案 1 :(得分: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的{​​{1}}格式说明符需要指向scanf数组中第一个元素的指针。你正在做的是传递数组本身的地址。

为此,只需传入数组的名称即可。传递给函数时,数组名称会衰减为指向第一个元素的指针。

char