【问题标题】:How to add data to structures with a dynamic array in C?如何在 C 中使用动态数组将数据添加到结构中?
【发布时间】: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]-&gt;name) 不正确。使用strcmp 进行字符串比较。
  • 这里,name 保存地址。
  • 除了需要strcmp()if(name!=Books[i]-&gt;name) ——如果你有很多不同的书,你认为会发生什么,你开始遍历所有的书,覆盖指向每本书的指针与您要存储的书不匹配的书(带有Books[i]= malloc(sizeof(book));)?您只能迭代您之前分配的书籍数量。 for (int i=0;i&lt;BOOK_NUM;i++) 似乎每次都遍历所有 4 个指针。由于Books 是全局的,Books[i]-&gt;name 将针对NULL 值进行段错误(很可能)
  • 我真的不知道,我还是不太明白这个概念。此时我的代码是一场灾难,我要做的就是拥有一个动态数组并专门为我需要添加的书分配内存。

标签: c struct structure dynamic-memory-allocation


【解决方案1】:
if((Books[i]==NULL))
 {
    free(Books);
    free(Books[i]);
    exit(1);
 }

在这里,您应该使用== 而不是=。使用= 将变为Books[i] = NULL

并使用strcmp 进行字符串比较。

【讨论】:

  • 请在此处查看if 条件。他正在使用= 进行比较。
  • 啊哈,到目前为止,我修复了 Krishna 提到的每一个细节,并修复了我的 main 中的一些内容,一切似乎都正常,它打印“The book {name} has been added”并返回主菜单。还有什么我应该注意的吗?我真的很感谢你的帮助。提前感谢你们两个:)!
  • @David 他正在检查malloc 之后的条件。所以他在分配内存后再次分配NULL。
  • @KrishnaKanthYenumula - 我道歉 - 如果这是验证码 - 那很好。你实际上想要while (i--) free (Books[i]); free (Books); exit (EXIT_FAILURE);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多