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

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;
}

修复关键点说明

  1. 用clearInputBuffer()函数替代fflush(stdin):通过读取输入缓冲区直到换行符,安全清除残留字符,避免干扰后续输入读取。
  2. 修正登录失败判断条件:确保三次错误输入后能正常显示限制提示。
  3. 优化输出格式:给菜单提示添加换行符,保证内容正常显示。
  4. 补充退出逻辑:添加case 0的处理分支,让程序退出流程更直观。

内容的提问来源于stack exchange,提问作者Raihan Firdaus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:15:22