【发布时间】:2021-04-01 17:45:15
【问题描述】:
这是我在 Stack-overflow 上的第一篇文章,我希望我没有发布重复的问题,但我找不到任何关于这个问题的参考资料。 我在 C 中有一个“图书馆管理系统”项目,我必须通过使用指向结构(书籍)的指针数组将书籍添加到“图书馆”。 问题是我尝试了很多东西,但到目前为止没有任何效果,我尝试的最后一件事给了我很多错误。
所以基本上我有这个系统,其中有一个主菜单,用户选择一个输入: 一种。添加/归还书 湾。拿一本书 C。按从图书馆借来的次数打印书籍 d。退出
如果我了解如何将数据添加到结构中,其余选项很容易处理。 到目前为止,我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define BOOK_NUM 4
#define NAME_LENGTH 200
#define AVAILABLE 10
#define NOT_AVAILABLE 20
int menu_on=1;
//~~~~~~~~~~~~~~~~~~~~~~
typedef struct book {
char name[NAME_LENGTH];
char author[NAME_LENGTH];
int available;
int times_borrowed;
} book;
book* Books[BOOK_NUM];
void AddBook()
{
char name[NAME_LENGTH];
printf("Please enter book name:");
scanf("%s", name);
for (int i=0;i<BOOK_NUM;i++)
{
if(name!=Books[i]->name)
{
Books[i]= malloc(sizeof(book));
if((Books[i]=NULL))
{
free(Books);
free(Books[i]);
exit(1);
}
strcpy(Books[i]->name, name); // here is the problem**
printf("Please enter author name:");
scanf("%s", Books[i]->author);
Books[i]->available=AVAILABLE;
Books[i]->times_borrowed=0;
printf("The book %s was successfully added!\n", name);
break;
}
else if ((name == Books[i]->name) && (Books[i]->available==AVAILABLE))
{
printf("This book is already in the library :)");
}
else if ((name == Books[i]->name) && (Books[i]->available==NOT_AVAILABLE))
{
ReturnBook(name); //this function is for later.
}
}
}
我要做的只是一次添加一本书,为它分配内存,然后是其余的细节。 “图书馆”最多包括 4 本书。
- available - 图书是否被借(可用/不可用)
- times_borrowed 应在添加新书时初始化,因为新书“以前从未借过”
如果我只知道如何添加这些书籍并使用动态数组及其内容,其余的事情就可以轻松完成。
我收到的错误是:EXC_BAD_ACCESS (code=1, address=0x0)
【问题讨论】:
-
if(name!=Books[i]->name)不正确。使用strcmp进行字符串比较。 -
这里,
name保存地址。 -
除了需要
strcmp()和if(name!=Books[i]->name)——如果你有很多不同的书,你认为会发生什么,你开始遍历所有的书,覆盖指向每本书的指针与您要存储的书不匹配的书(带有Books[i]= malloc(sizeof(book));)?您只能迭代您之前分配的书籍数量。for (int i=0;i<BOOK_NUM;i++)似乎每次都遍历所有 4 个指针。由于Books是全局的,Books[i]->name将针对NULL值进行段错误(很可能) -
我真的不知道,我还是不太明白这个概念。此时我的代码是一场灾难,我要做的就是拥有一个动态数组并专门为我需要添加的书分配内存。
标签: c struct structure dynamic-memory-allocation