VS Code终端运行C语言图书管理程序无输出问题求助
C语言图书管理程序无输出问题修复
问题描述
编写的C语言图书管理程序语法无错误,但在VS Code终端运行时无任何输出,终端仅显示空白。该问题在添加add、save函数(对应菜单选项1)后出现,期望程序能正常显示登录界面并支持输入输出。
问题分析
程序无输出的核心原因是使用了未定义行为的fflush(stdin):C标准仅规定fflush对输出流有效,对输入流调用fflush会导致程序行为异常,可能卡住输入输出流程。此外还有一处逻辑错误:登录失败次数的判断条件不正确,导致三次错误输入后无提示信息。
修复方案
- 移除所有
fflush(stdin)调用,改用自定义函数清除输入缓冲区的多余字符,避免输入残留干扰后续读取 - 修正登录失败后的判断条件,将
if(limit > 3)改为if(limit >= 3) - 给add函数中的菜单提示添加换行符,确保输出及时显示
- 补充退出菜单的逻辑处理,让程序退出流程更清晰
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TITLE_BOOK 1000 #define MAX_AUTHOR_BOOK 1000 #define MAX_CATEGORY_BOOK 1000 #define MAX_NAME_BORROW 1000 typedef struct { char title[MAX_TITLE_BOOK]; char author[MAX_AUTHOR_BOOK]; char category[MAX_CATEGORY_BOOK]; int code; }Book ; typedef struct { char name[MAX_NAME_BORROW]; int id; int codeBorrow; int dateBorrow[3]; int dateReturn[3]; }Borrow; // 自定义函数:安全清除输入缓冲区残留字符 void clearInputBuffer() { while(getchar() != '\n'); } void add(Book x[], int y){ int i; for(i = 0; i < y; i++){ printf("Menu ke-%d\n", i+1); printf("Enter the Book Title: "); scanf("%s", x[i].title); clearInputBuffer(); printf("Enter Book Author: "); scanf("%s", x[i].author); clearInputBuffer(); printf("Enter the Book Category: "); scanf("%s", x[i].category); clearInputBuffer(); printf("Enter Book Code: "); scanf("%d", &x[i].code); clearInputBuffer(); } } void save(Book x[], int y){ FILE* f_book; f_book = fopen("book-data.txt", "w"); if(f_book == NULL){ printf("\nUnable to open file, check file location or permissions\n"); return; } int i; for(i = 0; i < y; i++){ fprintf(f_book, "%s %s %s %d\n", x[i].title, x[i].author, x[i].category, x[i].code); } printf("\nData successfully saved to database\n"); fclose(f_book); } int main(){ char username[10] = "admin", password[10] = "admin"; char checkUser[10],checkPass[10]; int menu, limit = 0, total_books = 0, dataBook; Book s_book[1000]; do{ printf("\t\n================================\n"); printf("\tLogin Page\n"); printf("\t\n================================\n"); printf("\nMasukan Username: "); scanf("%s", checkUser); clearInputBuffer(); printf("\nMasukan Password: "); scanf("%s", checkPass); clearInputBuffer(); if(strcmp(checkUser, username) == 0 && strcmp(checkPass, password) == 0){ printf("\nSuccessfully Login\n"); break; }else{ printf("\nUsername or Password Wrong!\n"); } limit++; }while(limit < 3); if(limit >= 3){ printf("\nToo many request, try again in 30 seconds.\n"); } if(limit < 3){ do{ printf("\n"); printf("\t=================================\n"); printf("\tSystem Library IT Telkom Surabaya\n"); printf("\t=================================\n"); printf("1. Add Data\n"); printf("2. Read Data\n"); printf("3. Change/Update Data\n"); printf("4. Search Data\n"); printf("5. Sort Data\n"); printf("6. Borrow Book\n"); printf("7. Return Book\n"); printf("0. Exit\n"); printf("Menu: "); scanf("%d", &menu); clearInputBuffer(); switch(menu){ case 1: printf("\nInput Total Buku: "); scanf("%d", &dataBook); clearInputBuffer(); add(s_book, dataBook); save(s_book, dataBook); break; case 0: printf("\nExiting program...\n"); break; default: printf("\nMenu not available, re-enter\n"); break; } }while(menu != 0); } return 0; }
修复关键点说明
- 用
clearInputBuffer()函数替代fflush(stdin):通过读取输入缓冲区直到换行符,安全清除残留字符,避免干扰后续输入读取。 - 修正登录失败判断条件:确保三次错误输入后能正常显示限制提示。
- 优化输出格式:给菜单提示添加换行符,保证内容正常显示。
- 补充退出逻辑:添加case 0的处理分支,让程序退出流程更直观。
内容的提问来源于stack exchange,提问作者Raihan Firdaus
相关产品推荐
相关产品推荐

