【问题标题】:library of books , struct and malloc书库,结构和malloc
【发布时间】:2021-04-02 07:29:04
【问题描述】:

我正在尝试做一个图书馆 书是目标 用户可以输入一本书,然后我检查这本书是否是我的图书菜单: 如果菜单中有书:

如果这本书有货,那么我打印一条消息并返回 1 如果它不可用,那么我将书更改为可用并打印我添加的书

如果书不在菜单中: 我做 malloc 然后检查我 malloc 是否成功 如果 malloc 成功:我对对象执行 strcp 如果 malloc 没有成功:我对对象执行 free 并打印一条消息并返回 1

问题:当用户第二次进入该书时,它不应该将该书添加为新书!它应该检查这本书是否可用,然后返回一条消息,但我的代码没有这样做,我不知道错误在哪里!

#define _CRT_SECURE_NO_WARNINGS
#define BOOK_NUM  4
#define NAME_LENGTH 200
#define AVAILABLE 10
#define NOT_AVAILABLE 20

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

typedef struct book
{
    char name[NAME_LENGTH];  char author[NAME_LENGTH];  int available;  int times_borrowed;
}Book;

int main()
{
    Book *books[BOOK_NUM] = { 0 };
    char book_name[NAME_LENGTH];
    char author_name[NAME_LENGTH];
    int opreation = 0;
    int i;
    int j = 0;
    int m = 0;
    char tav;
    scanf("%d", &opreation);
    if (opreation == 1) {
        printf("please enter the name:");
        scanf("%c", &tav);
        do {// kelet of the book_name
            scanf("%c", &tav);
            if (tav == '\n')
                break;
            book_name[m] = tav;
            m++;
        } while (m < NAME_LENGTH);
        book_name[m] = '\0';
        for (i = 0; i < BOOK_NUM && *(books+i)!=NULL ; i++) {
            if (strcmp(*books[i]->name, book_name) == 0) 
            {
                if (books[i]->available = NOT_AVAILABLE)
                {
                    books[i]->available = AVAILABLE;
                    printf("This book is already in the library");
                    return 0;
                }
                else
                {
                    printf("There is no enough space in the library");
                    return 0;
                } 
            
            }
        }  
             //befot bs eza 3ml sreka ghad 3la kolshe w ma tghyr eshe 
        for (j; j < BOOK_NUM; j++) {
            if (books[j] == NULL)
            {
                books[j] = (Book*)malloc(sizeof(Book));
            if (books[j] != NULL)
            {
                strcpy(books[j]->name, book_name);
                printf("Please enter author name:");
                m = 0;
                do {// kelet of the book_name
                    scanf("%c", &tav);
                    if (tav == '\n')
                        break;
                    author_name[m] = tav;
                    m++;
                } while (m < NAME_LENGTH);
                author_name[m] = '\0';
                strcpy(books[j]->author, author_name);
                books[j]->available = AVAILABLE;
                books[j]->times_borrowed = 0;
                printf("The book %s was successfully added!", book_name);
                return 0;
            }
            else
            {
                    for (int k = 0; k < BOOK_NUM && books[k]!=NULL; k++) {
                        free(books[k]);
                    }
                    printf("NO MEMORY");
                    return 1;
             }
                
            }
        }
    } 

 }

【问题讨论】:

  • 这似乎是学习两件事的好时机:首先不要在没有测试的情况下编写大部分代码(分而治之在软件开发中非常有用);以及如何使用 debugger 逐条执行代码,同时监控变量及其值。
  • 每次程序调用只执行一个命令。您不读取文件也不写入文件。也就是说,您不会将您创建的任何数据存储在文件中,以便它可以在程序调用中持续存在。是否分配使用文件?或者,您是否应该循环执行命令(即程序将执行任意数量的命令)?
  • 请注意,if (strcmp(*books[i]-&gt;name, book_name) == 0) 生成了编译器警告。我建议if (strcmp(books[i]-&gt;name, book_name) == 0)
  • @CraigEstey 我不能在这个作业中使用文件......也许 fgets 函数可以提供帮助??

标签: c struct malloc free stdio


【解决方案1】:

也许现在更好:

#define _CRT_SECURE_NO_WARNINGS
#define BOOK_NUM  4
#define NAME_LENGTH 200
#define AVAILABLE 10
#define NOT_AVAILABLE 20

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

typedef struct book
{
    char name[NAME_LENGTH];  char author[NAME_LENGTH];  int available;  int times_borrowed;
}Book;

int main()
{
    Book *books[BOOK_NUM] = { 0 };
    char book_name[NAME_LENGTH];
    char author_name[NAME_LENGTH];
    int opreation = 0;
    int i;
    int j = 0;
    int m = 0;
    char tav;
    scanf("%d", &opreation);
    if (opreation == 1) {
        printf("please enter the name:");
        scanf("%c", &tav);
        do {// kelet of the book_name
            scanf("%c", &tav);
            if (tav == '\n')
                break;
            book_name[m] = tav;
            m++;
        } while (m < NAME_LENGTH);
        book_name[m] = '\0';
        for (i = 0; i < BOOK_NUM && *(books+i)!=NULL ; i++) {
            if (strcmp(books[i]->name, book_name) == 0)
            {
                if (books[i]->available == NOT_AVAILABLE)
                {
                    books[i]->available = AVAILABLE;
                    printf("This book is already in the library");
                    return 0;
                }
                else
                {
                    printf("There is no enough space in the library");
                    return 0;
                }

            }
        }
             //befot bs eza 3ml sreka ghad 3la kolshe w ma tghyr eshe

      if (books[j] == NULL)
      {
          books[j] = (Book*)malloc(sizeof(Book));
      if (books[j] != NULL)
      {
          strcpy(books[j]->name, book_name);
          printf("Please enter author name:");
          m = 0;
          do {// kelet of the book_name
              scanf("%c", &tav);
              if (tav == '\n')
                  break;
              author_name[m] = tav;
              m++;
          } while (m < NAME_LENGTH);
          author_name[m] = '\0';
          strcpy(books[j]->author, author_name);
          books[j]->available = AVAILABLE;
          books[j]->times_borrowed = 0;
          printf("The book %s was successfully added!", book_name);
          return 0;
      }
      else
      {
              for (int k = 0; k < BOOK_NUM && books[k]!=NULL; k++) {
                  free(books[k]);
              }
              printf("NO MEMORY");
              return 1;
       }

      }

    }

 }

顺便说一句,你应该听听编译器警告。

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2021-01-15
    • 2020-03-22
    • 2016-07-05
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2011-07-24
    • 2013-05-09
    相关资源
    最近更新 更多