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
相关产品推荐
相关产品推荐

