You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言图书管理系统if条件判断失效问题求助

图书管理系统容量检查逻辑问题分析与修复

核心问题

你在case 1中的容量检查逻辑失效,根源是**incrementBN()的调用时机错误**:
在获取用户输入的图书数量后,你立刻让bookno自增,此时再访问book[bookno].Quantity,指向的是下一个未初始化的结构体变量,其值是随机垃圾数据,并非用户刚输入的数量值,导致条件判断完全偏离预期,自然无法进入限制输入的if块。

修复方案

1. 调整incrementBN()调用位置

将incrementBN()移到数量验证和TotalQuantity更新完成之后,确保判断时使用的是当前图书的数量值。

2. 替换不安全的gets()函数

gets()存在缓冲区溢出风险,改用fgets()读取字符串,并手动去除末尾的换行符。

3. 移除不必要的动态内存分配

YN和index无需动态分配,直接使用栈变量即可,避免内存泄漏。

4. 修复case 2的无限循环

循环体内必须递增index,否则会持续打印同一本书的信息。

修改后的完整代码

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

typedef struct book
{
    char name[50];
    char Authorname[20];
    int Quantity;
} bk;

static int bookno = 1;

void incrementBN()
{
    bookno++;
}
void decrementBN()
{
    bookno--;
}

int main()
{
    int capacity = 100;
    bk book[capacity];
    int TotalQuantity = 0;

    int option;

    puts("Welcome to Library Management");
    puts("---------------------------");
    puts("1. Add Books.");
    puts("2. View Books.");
    puts("3. Remove Books.");
    puts("4. Issue Books.");
    puts("5. View Issue Books.");
    puts("6. Return Books.");
    puts("---------------------------");
    printf("Enter your option : ");
    scanf("%d", &option);
    getchar();

    switch (option)
    {
    case 1:
        if (TotalQuantity < capacity)
        {
            char YN = 'y';

            while (YN == 'y' || YN == 'Y')
            {
                printf("Enter Details for Book No %d.\n", bookno);
                
                printf("Enter Name of book No : ");
                fgets(book[bookno].name, sizeof(book[bookno].name), stdin);
                // 去除换行符
                book[bookno].name[strcspn(book[bookno].name, "\n")] = '\0';
                printf("\nName of book : %s \n", book[bookno].name);

                printf("Enter Name of Author : ");
                fgets(book[bookno].Authorname, sizeof(book[bookno].Authorname), stdin);
                book[bookno].Authorname[strcspn(book[bookno].Authorname, "\n")] = '\0';
                printf("Name of Author : %s \n", book[bookno].Authorname);

                printf("Enter Quantity of books : ");
                scanf("%d", &book[bookno].Quantity);
                getchar();
                printf("Quantity Available : %d and total quantity is %d\n", book[bookno].Quantity, (book[bookno].Quantity + TotalQuantity));

                // 先做容量检查,再递增bookno
                if (capacity < (book[bookno].Quantity) + TotalQuantity)
                {
                    printf("Enter Quantity of books less than %d : ", capacity - TotalQuantity);
                    scanf("%d", &book[bookno].Quantity);
                    getchar();
                    TotalQuantity += book[bookno].Quantity;
                }
                else
                {
                    TotalQuantity += book[bookno].Quantity;
                }
                
                // 处理完当前图书后再递增编号
                incrementBN();

                printf("Do you want to add new book : (Y/N) ");
                scanf("%c", &YN);
                getchar();
            }
        }
        else
        {
            printf("You Cannot Add new Books because Space is full.\n");
        }
        break;

    case 2:
        {
            int index = 1;
            while (index < bookno)
            {
                printf("\nName of book : %s \n", book[index].name);
                printf("Name of Author : %s \n", book[index].Authorname);
                printf("Quantity Available : %d \n", book[index].Quantity);
                index++; // 修复无限循环
            }
        }
        break;

    default:
        printf("Please Select the Valid option\n");
        break;
    }

    return 0;
}

关键改动说明

  • 将incrementBN()移到容量检查和TotalQuantity更新之后,确保判断时使用的是当前图书的数量。
  • 用fgets()替代gets(),并通过strcspn()去除字符串末尾的换行符,避免输入残留问题。
  • 把动态分配的YN和index改为栈变量,简化代码同时避免内存泄漏。
  • 在case 2的循环中添加index++,解决无限循环问题。

内容的提问来源于stack exchange,提问作者Sufiyan Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:21:01