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

银行管理系统主函数循环异常及VS Code编译问题求助

银行管理系统循环输出异常问题修复与Stack Overflow提问指南

问题概述

开发银行管理系统时,添加主循环后输出出现混乱,无循环时运行正常。代码在GDP编译器下输出符合预期,但在VS Code中输出格式错乱。

不同环境输出对比

VS Code 输出

Enter Your Name : O

Enter Your Account Number : 1

Main Menu

  1. Deposit
  2. Withdraw
  3. Transfer
  4. Account Details
  5. Transaction Details
  6. Exit

Please Select The Desired Service
1

Deposit
Please Enter the Amount To Be Deposited
10000
10000.000000 Have Been Deposited To Account 1
Balance : 10000.00-----
u

  1. Deposit

GDP编译器输出

Enter Your Name : O

Enter Your Account Number : 1

Main Menu

  1. Deposit
  2. Withdraw
  3. Transfer
  4. Account Details
  5. Transaction Details
  6. Exit

Please Select The Desired Service
1
Deposit
Please Enter the Amount To Be Deposited
10000
10000.000000 Have Been Deposited To Account 1
Balance : 10000.00

Main Menu

  1. Deposit
  2. Withdraw
  3. Transfer
  4. Account Details
  5. Transaction Details
  6. Exit

Please Select The Desired Service

问题分析与修复方案

核心问题点

  1. 输出缺少换行符导致格式错乱:deposit和transfer函数中,打印余额的语句未添加换行符,导致后续菜单输出直接拼接在余额行末尾,造成混乱。
  2. 函数返回值类型不匹配:deposit函数声明为int类型,但未返回任何值,属于未定义行为,不同编译器处理逻辑不同。
  3. 条件判断的赋值错误:transaction_details函数中,if (c=EOF)是赋值操作而非比较操作,会导致逻辑判断失效。
  4. fgets读取的字符串包含换行符:输入用户名时,fgets会将回车换行符一并存入数组,导致打印账户信息时出现多余换行。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <string.h>  // 新增头文件处理字符串

char client_name[20];
double deposit_amount=0;
int account_number;
double total_amount=0;
double withdraw_amount=0;
double transfer_amount=0;
int trans_acc_number;

void menu()
{
    printf("------------------------------\n");
    printf("          Main Menu\n");
    printf("------------------------------\n");
    printf("1) Deposit\n");
    printf("2) Withdraw\n");
    printf("3) Transfer\n");
    printf("4) Account Details\n");
    printf("5) Transaction Details\n");
    printf("6) Exit\n\n");
}
// 修改为void类型,匹配函数实际行为
void deposit()
{
    time_t tm;
    time (&tm);
    FILE *ptr = fopen("Account.txt","a");
    printf("Deposit\n");
    printf("Please Enter the Amount To Be Deposited\n");
    scanf("%lf",&deposit_amount);
    total_amount=total_amount+deposit_amount;
    printf("%f Have Been Deposited To Account %d\n",total_amount,account_number);
    // 添加换行符,避免后续输出拼接
    printf("Balance : %.2f\n",total_amount);
    fprintf(ptr,"£%.3f Have Been Deposited To Account %d\n",total_amount,account_number);
    fprintf(ptr,"Date & Time of Transaction is %s\n",ctime(&tm));
    fclose(ptr);
}
void withdraw()
{
    time_t tm;
    time (&tm);
    FILE *ptr =fopen("Account.txt","a");
    printf("Withddraw\n");
    printf("Please Enter the Amount To Be Withdrawn\n");
    scanf("%lf",&withdraw_amount);
    total_amount=total_amount-withdraw_amount;
    printf("£%f Have Been Withdrawn From Account %d\n",withdraw_amount,account_number);
    printf("Balance : %.3f\n",total_amount);
    fprintf(ptr,"£%.3f Have Been Withdrawn from Account %d\n",total_amount,account_number);
    fprintf(ptr,"Date & Time of Transaction is %s\n",ctime(&tm));
    fclose(ptr);
}
void transfer()
{
    FILE *ptr =fopen("Account.txt","a");
    printf("Transfer\n");
    printf("Enter Amount To Be Transfered : ");
    scanf("%lf",&transfer_amount);
    printf("\nEnter The Account Number : ");
    scanf("%d",&trans_acc_number);
    if (total_amount<transfer_amount)
    {
        printf("Insufficient Balance\n");  // 添加换行符
    }
    else 
    {
        total_amount=total_amount-transfer_amount;
        printf("Transfer Successful\n");
        // 添加换行符,避免后续输出拼接
        printf("Balance : %f\n",total_amount);
        fprintf(ptr,"£%f Have Been Transfered to Account %d\n",transfer_amount,trans_acc_number);
        fclose(ptr);
    }  
}
void account_details()
{
    printf("Account Details\n");
    printf("Account Name : %s\n",client_name);
    printf("Account Number : %d\n",account_number);
    printf("Balance : £%.3f\n",total_amount);
}
void transaction_details()
{
    FILE *ptr;
    ptr=fopen("Account.txt","r");
    if (ptr == NULL) {  // 新增文件打开失败判断
        printf("Failed to open transaction file\n");
        return;
    }
    char c = fgetc(ptr);
    // 修正为比较操作==
    if (c == EOF)
    {
        printf("No Transactions have been made\n");
    }
    else 
    {
        printf("Transaction Details\n");
        while (c!=EOF)
        {
            printf("%c",c);
            c=fgetc(ptr);
        }
    }
    fclose(ptr);  // 新增关闭文件,避免资源泄漏
}
void last_details()
{
    printf("Account Details\n");
    printf("Account Name : %s\n",client_name);
    printf("Account Number : %d\n",account_number);
    printf("Balance : £%.3f\n",total_amount);
}
int  main()
{
    int cycle = 1;
    FILE *ptr = fopen("Account.txt","w");
    if (ptr == NULL) {  // 新增文件打开失败判断
        printf("Failed to open account file\n");
        return 1;
    }
    int mm_choice;
    printf("Enter Your Name : ");
    fgets(client_name,19,stdin);
    // 去掉fgets读取的换行符
    client_name[strcspn(client_name, "\n")] = '\0';
    fprintf(ptr,"\nName : %s\n",client_name);
    printf("\n");

    printf("Enter Your Account Number : ");
    scanf("%d",&account_number);
    fprintf(ptr,"Account No.: %d\n",account_number);
    fclose(ptr);
    while (cycle ==1)
    {
        menu();
        printf("Please Select The Desired Service\n");
        scanf("%d",&mm_choice);
        switch (mm_choice)
        {
            case 1:
                system("cls");
                deposit();
                break;
            case 2:
                system("cls");
                withdraw();
                break;
            case 3: 
                system("cls");
                transfer();
                break;
            case 4:
                system("cls");
                account_details();
                break;
            case 5:
                system("cls");
                transaction_details();
                break;
            case 6:
                system("cls");
                last_details();
                cycle = 0;
                break;
            default:
                printf("Please Enter A Valid Number.\n");
        }
    }
    
    return 0;
}

额外优化说明

  • 新增文件打开失败判断,避免空指针操作;
  • 在transaction_details中新增文件关闭操作,防止资源泄漏;
  • 在transfer的余额不足提示中添加换行符,保持输出格式统一。

Stack Overflow正确提问指南

  1. 精准描述问题:明确说明功能目标、异常表现(如“循环后主菜单输出拼接在余额行后”)、环境差异(VS Code使用的编译器版本、GDP编译器信息)。
  2. 提供最小可复现代码:剔除无关功能(如文件操作),只保留能复现问题的核心代码,降低排查难度。
  3. 完整展示输入输出:像你现在做的一样,提供不同环境下的完整输入和对应输出,清晰对比差异。
  4. 说明已尝试的方案:列出你已经做过的修改(如“根据评论调整了XX代码”)和修改后的结果,帮助回答者快速定位。
  5. 标注工具版本:说明VS Code版本、使用的编译器(如MinGW 8.1.0)、操作系统等环境信息。

内容的提问来源于stack exchange,提问作者Omar Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:59